如何将向量<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 c 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*?
这与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 c 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*?