我似乎无法看到我在这里做错了什么,并且稍微偏离了我的深度。
我所拥有的是一些包含向量和多图的数据结构。
我想制作包含原始数据指针的第二个矢量/多图,这样如果我编辑第二个矢量/地图,则原始数据会发生变化。原因是该列表是基于某些标准的orig的临时子集。
首先我在矢量上尝试了这个,它似乎有效,这是一个有效的例子:
std::vector<std::string> strVect;
strVect.push_back("test1");
strVect.push_back("test2");
strVect.push_back("test3");
std::vector<std::string *>strpVect;
for (std::string &str : strVect)
{
strpVect.push_back(&str);
}
这里,strpVect中的元素指向strVect中的原文。
现在我想为多重映射做同样的事情:
std::multimap<int, std::string> strMap;
strMap.insert(std::pair<int, std::string>(1, "test1"));
strMap.insert(std::pair<int, std::string>(2, "test2"));
strMap.insert(std::pair<int, std::string>(3, "test3"));
std::multimap<int, std::string *>strpMap;
for (std::pair<int, std::string> &val : strMap) // <<<<< error here
{
strpMap.insert(std::pair<int, std::string *>(val.first, &val.second));
}
现在,当我运行此操作时,我收到错误invalid init of non-const reference of type std::pair....
如果我把它变为const那么它就可以了:
std::multimap<int, std::string> strMap;
strMap.insert(std::pair<int, std::string>(1, "test1"));
strMap.insert(std::pair<int, std::string>(2, "test2"));
strMap.insert(std::pair<int, std::string>(3, "test3"));
std::multimap<int, std::string *>strpMap;
for (const std::pair<int, std::string> &val : strMap)
{
strpMap.insert(std::pair<int, std::string *>(val.first, &val.second)); // <<<<< error here
}
但是我在插入时得到了一个错误(对我来说更明显) - 但是我不想插入一个const,因为我想改变里面的值......我可以把它丢掉,但是我看到了这是我编码的失败:(
答案 0 :(得分:6)
(多)地图中的关键字是const
。
因此,
for (std::pair<const int, std::string> &val : strMap)
{
strpMap.insert(std::pair<int, std::string *>(val.first, &val.second));
}
应该这样做。
或者,甚至更好(imho),使用auto
:
for (auto &val : strMap)
{
strpMap.insert(std::pair<int, std::string *>(val.first, &val.second));
}
这会自动为您提供const
。
答案 1 :(得分:3)
多图的值类型为pair<const key_type,mapped_type>
所以你应该可以使用它。
for (std::pair<const int, std::string> &val : strMap)
{
strpMap.insert(std::pair<int, std::string *>(val.first, &val.second));
}
无法使用非const版本的原因如下。
地图条目以按键排序的方式存储。如果您之后更改了密钥,它仍然保留在其先前的排序位置,那么即使您插入数据,查找也可能不会产生任何结果。这是因为它查看了键已插入的位置,但如果在列表中插入键值后更改键值则不会匹配。