如何将元素从地图复制到std :: string

时间:2015-06-28 06:22:06

标签: c++ string vector stdmap

我正在编写一个使用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) - &gt; second.begin(); itr!= mymap.find(mykey) - &gt; second.end(); ++ itr){< / p>

    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);}

}

我现在收到“vector not incrementable”错误。你能告诉我为什么吗?另外,在地图中复制值会发生什么?非常感谢你的帮助!

1 个答案:

答案 0 :(得分:0)

copy_n只有一个副本只有一个元素(当然),但是你要在string上混合一个输入迭代器,在char上混合一个输出迭代器。

那么你想读取当前字符串的第一个字符或整个字符串吗?我想第二个在你的上下文中更有意义。所以你可以简单地推理迭代器:

string const& find_key = *itr;

关于性能,即使我不建议在软件开发过程中过早地考虑优化,但在这里执行一些搜索的次数太多了。

例如,在第一个循环中,每次迭代时,您都会在地图中查找mykey。您可以使用C ++ 11功能重写它:

for (auto const& str : mymap.find(mykey)->second)

这将只调用find一次并迭代{假设存在)vector string

我猜您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));
    }
}

这不是更有意义吗? ; - )