基于C ++ 11范围的多图循环 - 无法返回非常量对

时间:2016-09-27 10:45:11

标签: c++ c++11 vector multimap

我似乎无法看到我在这里做错了什么,并且稍微偏离了我的深度。

我所拥有的是一些包含向量和多图的数据结构。

我想制作包含原始数据指针的第二个矢量/多图,这样如果我编辑第二个矢量/地图,则原始数据会发生变化。原因是该列表是基于某些标准的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,因为我想改变里面的值......我可以把它丢掉,但是我看到了这是我编码的失败:(

2 个答案:

答案 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版本的原因如下。

地图条目以按键排序的方式存储。如果您之后更改了密钥,它仍然保留在其先前的排序位置,那么即使您插入数据,查找也可能不会产生任何结果。这是因为它查看了键已插入的位置,但如果在列表中插入键值后更改键值则不会匹配。