如何将向量<string>转换为向量<char*>

How to convert a vector<string> to a vector<char*>

这与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())] = '[=12=]';
}

这是正确的吗?

有没有更好的实现方式?


p.s。当然最后我有:

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

您可以简单地使用 string::c_str() to get the string out of a std::string. Read more in How to convert a std::string to const char* or char*?

或者您可以稍微修改一下函数体,但是否值得这样做只有您自己知道。


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

为什么要为字符串分配新的缓冲区?您正在将 vector 个字符指针传递给一个函数,并最终删除分配的缓冲区。这意味着这些缓冲区是临时的,只要源 vector(vector<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();
});

您的 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 * 向量的函数几乎肯定不会关心它。

更快的方法是

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

然后使用生成的向量。这将节省大量数据的内存分配时间。

vector < string > 到 vector < const char* > :使用 c_str()

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

向量<字符串>到向量<字符*>:使用&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*?