[英]how to copy elements from a map to a std:: string
我正在編寫一個使用std::map
實現單向圖的程序。 我必須搜索鍵,然后將與該鍵對應的向量值復制到地圖中的新位置。 問題是我搜索的鍵是從地圖中的另一個位置提取的。 我明白為什么我會收到錯誤,因為std::copy_n
沒有從向量復制到字符串(盡管它以另一種方式工作),但我不知道如何解決這個問題。 我正在復制下面的代碼片段:要搜索的鍵存儲在與鍵 mykey 相對應的向量中。
for (
vector<string>::iterator itr = mymap.find(mykey)->second.begin()
; itr != mymap.find(mykey)->second.end()
; itr++
)
{
string find_key = "";
// error C2664 :cannot convert parameter 1 from 'std::_Vector_iterator<_Myvec>'
// to 'const std::basic_string<_Elem,_Traits,_Ax> &'
std::copy_n(itr, 1, find_key.begin());
if (mymap.find(find_key) == mymap.end())
cout << "key not found" << endl;
else
mymap[mykey].insert(
mymap.find(find_key)->second.begin()
, mymap.find(find_key)->second.end()
);
}
編輯:使用 stringstream 從地圖中提取鍵
for (vector::iterator itr =mymap.find(mykey)->second.begin(); itr!=mymap.find(mykey)->second.end();++itr){
stringstream ss;
ss<< *itr;
string find_key = ss.str();
if (mymap.find(find_key)==mymap.end())
cout<<"key not found"<<endl;
else
for (vector<string>::iterator mapit= mymap.find(find_key)->second.begin(); mapit!=mymap.find(find_key)->second.end(); ++mapit)
mymap[mykey].push_back(*mapit);}
}
我現在收到“向量不可增加”錯誤。 你能告訴我為什么嗎?另外,地圖中的重復值會發生什么? 非常感謝你的幫助!
copy_n
大小為 one 只復制一個元素(當然),但是您將string
上的輸入迭代器和char
上的輸出迭代器混合在一起。
那么你是要讀取當前字符串的第一個字符還是整個字符串? 我想第二個在你的上下文中更有意義。 所以你可以簡單地尊重迭代器:
string const& find_key = *itr;
關於性能,盡管我不建議在您的軟件開發過程中過早地研究優化,但在這里您會執行一些搜索方式太多次。
例如,在第一個循環中,在每次迭代時,您將在地圖中查找mykey
。 您可以使用 C++11 特性重寫它:
for (auto const& str : mymap.find(mykey)->second)
這將只調用一次find
並迭代string
的(假設存在的)關聯vector
。
在這里,我猜str
就是您在原始帖子中所說的find_key
。
然后再次調用mymap.find(find_key)
三次。 這可以很容易地優化。 此外, insert
編譯? 我在文檔中找不到匹配的函數...
auto it = mymap.find(find_key);
if (it == mymap.end()) {
cout << "key not found" << endl;
} else {
auto const& vec = *it; // a ref to vector of strings to be copied
auto& dest = mymap[mykey];
dest.insert(std::end(dest), std::begin(vec), std::end(vec));
}
當我們把所有東西放在一起時,我們得到:
for (auto const& find_key : mymap.find(mykey)->second) {
auto it = mymap.find(find_key);
if (it == mymap.end()) {
std::cout << "key not found" << std::endl;
} else {
auto const& vec = *it; // a ref to vector of strings to be copied
auto& dest = mymap[mykey];
dest.insert(std::end(dest), std::begin(vec), std::end(vec));
}
}
這不是更有意義嗎? ;-)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.