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

时间:2015-08-03 18:31:31

标签: c++ algorithm

我有一个字符串向量,其中包含一些大于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;
}

是否有任何内置工具可以更好,更快地完成此操作? (我已从此代码段中排除了错误检查和转换)

编辑:

我向malloc添加了+1。我要求从初始条件到预期输出的最小复杂性方式。我正在使用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

2 个答案:

答案 0 :(得分:5)

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());

答案 1 :(得分:1)

反复追加到字符串将导致字符串重复重新分配内存并将其内容重新分配到新的更大空间。 stringstream的创建成本更高,但它的附加速度比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()创建的临时内容。