如何将vector <string>转换为vector <char *>

时间:2017-02-27 18:24:07

标签: c++ stl char stdvector

这与How to convert a vector<char*> to a vector<string>/string问题相反。

我有一些与vector<char*>一起使用的遗留例程,因此我需要转换vector<string>

以下是我的建议:

std::vector<char*> charVec(strVec.size(),nullptr);
for (int i=0; i<strVec.size();i++) {
    charVec[i]= new char(strVec[i].size()+1); 
    charVec[i][strVec[i].copy(charVec[i], strVec[i].size())] = '\0';
}

这是对的吗?

有没有更好的方法来实现它?

P.S。当然最后我有:

for (int i=0; i<strVec.size();i++) {
    delete charVec[i];
}

5 个答案:

答案 0 :(得分:6)

更快的方法是

std::vector<const char*> charVec(strVec.size(),nullptr);
for (int i=0; i<strVec.size();i++) {
    charVec[i]= strVec[i].c_str();
}

然后使用得到的矢量。这将为大量数据集的内存分配节省大量时间。

答案 1 :(得分:3)

为什么要为字符串分配新的缓冲区?您正在将vector个字符指针传递给函数,最后删除已分配的缓冲区。这意味着这些缓冲区是临时的,只要源vectorvector<string>)存在就不需要为它们分配内存。

您可以轻松地执行此操作:

std::vector<std::string> vec1 = { "1", "2", "3" };
std::vector<const char*> vec2;

vec2.resize(vec1.size(), nullptr);

std::transform(std::begin(vec1), std::end(vec1), std::begin(vec2), [&](const std::string& str)
{
    return str.c_str();
});

答案 2 :(得分:3)

您的new声明看起来不对。您希望分配一个char的数组足够长的时间来保存字符串。您正在分配一个char,其值是字符串的长度。我很惊讶你没有得到编译器警告。

试试这个:

std::vector<char*> charVec;
for (const auto &str : strVec) {
  char *charStr = new char[str.size() + 1];
  std::strcpy(charStr, str.c_str());
  charVec.push_back(charStr); 
}

这里唯一的缺点是,如果其中一个字符串嵌入了空字符,那么除此之外的任何内容都不会被复制。但是我怀疑一个带char *向量的函数几乎肯定不关心那个。

答案 3 :(得分:2)

您可以简单地使用string::c_str()从std :: string中获取字符串。阅读How to convert a std::string to const char* or char*?

中的更多内容

或者您可以稍微修改一下该功能的主体,但只有您知道这是否值得。

当然,正如ssell在评论中提到的那样,请记住,使用这种方法时,您无需在处理它们时销毁它们!这是一个权衡,你避免复制(太酷了),但你需要小心不要阅读垃圾(如果你删除你的字符串)!

答案 4 :(得分:0)

向量<字符串>到向量:使用c_str()

std::vector<const char*> charVec(strVec.size(), nullptr);
for (int i=0; i<strVec.size(); i++) {
    charVec[i] = strVec[i].c_str();
}

vector <字符串>到vector :使用&x [0]

std::vector<char*> charVec(strVec.size(), nullptr);
for (int i=0; i<strVec.size(); i++) {
    charVec[i] = &strVec[i][0];
}

参考:How to convert a std::string to const char* or char*?