繁体   English   中英

将字符串向量转换为缓冲区

[英]Convert string vector to buffer

我有一个字符串向量,其中包含一些大于500的字符串。我正在使用openssl函数,这些函数需要用于加密/解密的缓冲区。 假设我以这种方式使用字符串向量和缓冲区,那么就空间和时间而言,进行此转换的最佳算法是什么。 可以假定每个字符串少于200个字符。

当前,我正在提取路径中的每个条目,连接字符串,调用.c_str()方法,并使用strcpy从函数中提取。

void copy(vector<string>& paths, unsigned char** plainTextBuffer, size_t& p_len){
int size = paths.size();
int i = 0;
string temp = "";
for(i=0; i<size; i++){
  temp+= paths[i];
  temp+= "\n";
}
p_len = temp.length();
(*plainTextBuffer) = malloc(p_len + 1);
strcpy((*plainTextBuffer), temp.c_str());
return;
}

有内置的工具可以更好,更快地做到这一点吗? (我已从此代码段中排除了错误检查和转换)

编辑:

我将+1添加到了malloc中。 我要求一种从初始条件到预期输出的最小复杂度方式。 我使用malloc是因为我使用了一个简单的缓冲区,它比新缓冲区快。

编辑2:

多亏了一些评论,我削减了中间人的一些复制品,并提出以下建议

void copy(vector<string>& paths, unsigned char** plainTextBuffer, size_t& p_len){
    int size = paths.size(), total = 0, i = 0;
    for(i=0; i<size; i++){
      total+= paths[i].size() + 1;
    }
    p_len = total;
    (*plainTextBuffer) = malloc(p_len + 1);
    (*plainTextBuffer)[0] = '\0';
    for(i=0; i<size; i++){
      strcat((*plainTextBuffer), paths[i].c_str());
      strcat((*plainTextBuffer, "\n");
    }
    return;
}

再次,我省略了一些选角。 有没有更有效的方式将缓冲区数据放入plainTextBuffer

string转换为C样式字符串的最快方法是不进行任何转换。 首先,让我们将std::vector<std::string>转换为一个std::string

std::vector<std::string> v = ...;
std::string output;
for (auto& s : v) {
    output += s;
    output += '\n';
}

然后,您可以将其传递给:

void some_c_api(char*, size_t );
void some_const_c_api(const char*, size_t);

some_c_api(&output[0], output.size());
some_const_c_api(output.c_str(), output.size());

重复追加到字符串中将导致该字符串反复重新分配内存,并将其内容改组到新的较大空间中。 字符串流具有更大的创建成本,但它的添加速度比std :: string快得多,因此,除了将其附加到循环中的字符串之外,还可以将其附加到字符串流中:

stringstream temp;
for(size_t i=0; i<paths.size(); i++){
    temp << paths[i] << endl;
}
const std::string& tmp = temp.str();

然后就像使用先前的临时字符串一样使用tmp。 最好获得对temp.str()的常量引用,因为它不会复制str()创建的临时文件的内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM