这与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];
}
答案 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
个字符指针传递给函数,最后删除已分配的缓冲区。这意味着这些缓冲区是临时的,只要源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();
});
答案 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中获取c字符串。阅读How to convert a std::string to const char* or char*?
中的更多内容或者您可以稍微修改一下该功能的主体,但只有您知道这是否值得。
当然,正如ssell在评论中提到的那样,请记住,使用这种方法时,您无需在处理它们时销毁它们!这是一个权衡,你避免复制(太酷了),但你需要小心不要阅读垃圾(如果你删除你的字符串)!
答案 4 :(得分:0)
向量<字符串>到向量
std::vector<const char*> charVec(strVec.size(), nullptr);
for (int i=0; i<strVec.size(); i++) {
charVec[i] = strVec[i].c_str();
}
vector <字符串>到vector
std::vector<char*> charVec(strVec.size(), nullptr);
for (int i=0; i<strVec.size(); i++) {
charVec[i] = &strVec[i][0];
}