[英]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.