我正在编写一个使用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”错误。你能告诉我为什么吗?另外,在地图中复制值会发生什么?非常感谢你的帮助!
答案 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));
}
}
这不是更有意义吗? ; - )