簡體   English   中英

如何轉換矢量 <string> 到一個向量 <char*>

[英]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傳遞給函數,最后刪除已分配的緩沖區。 這意味着這些緩沖區是臨時的,只要存在源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();
});

你的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中獲取字符串。 閱讀更多如何將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];
}

參考: 如何將std :: string轉換為const char *或char *?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM