[英]How to convert a vector<string> to a vector<char*>
這與如何將vector <char *>轉換為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';
}
這個對嗎?
有沒有更好的方法來實現它?
ps當然最后我有:
for (int i=0; i<strVec.size();i++) {
delete charVec[i];
}
更快的方法是這樣做
std::vector<const char*> charVec(strVec.size(),nullptr);
for (int i=0; i<strVec.size();i++) {
charVec[i]= strVec[i].c_str();
}
然后使用得到的矢量。 這將為大型數據集的內存分配節省大量時間。
為什么要為字符串分配新的緩沖區? 您正在將一個字符指針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 *
向量的函數幾乎肯定不關心那個。
你可以簡單地使用string :: c_str()從std :: string中獲取c字符串。 閱讀更多如何將std :: string轉換為const char *或char *?
或者你可以修改一下函數的主體,但只有你知道這是否值得。
當然,正如ssell在評論中提到的那樣,請記住,使用這種方法時,您不需要在處理它們時銷毀它們! 這是一個權衡,你避免復制(這么酷),但你需要小心不要閱讀垃圾(如果你刪除你的字符串)!
vector <string> to vector <const char *>:use 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 <string> to vector <char *>:use&x [0]
std::vector<char*> charVec(strVec.size(), nullptr);
for (int i=0; i<strVec.size(); i++) {
charVec[i] = &strVec[i][0];
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.