簡體   English   中英

如何將元素從映射復制到 std:: 字符串

[英]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.

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