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

cod*_*der 1 c++ vector multimap c++11

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

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

我想制作包含原始数据指针的第二个矢量/多图,这样如果我编辑第二个矢量/地图,数据就会在原始数据中发生变化.原因是该列表是基于某些标准的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);
}
Run Code Online (Sandbox Code Playgroud)

这里,strpVect中的元素指向strVect中的原始元素.

现在我想为multimaps做同样的事情:

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));
}
Run Code Online (Sandbox Code Playgroud)

现在,当我运行这个时,我得到了错误 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
}
Run Code Online (Sandbox Code Playgroud)

但是我在插入时得到了一个错误(对我来说更明显) - 但是我不想插入一个const,因为我想改变里面的值....我可以把它丢掉,但我认为这是一个我的编码失败:(

Mar*_*olt 6

(多)地图中的关键是const.从而,

for (std::pair<const int, std::string> &val : strMap)
{
    strpMap.insert(std::pair<int, std::string *>(val.first, &val.second));
}
Run Code Online (Sandbox Code Playgroud)

应该做的伎俩.

或者,甚至更好(imho),使用auto:

for (auto &val : strMap)
{
    strpMap.insert(std::pair<int, std::string *>(val.first, &val.second));
}
Run Code Online (Sandbox Code Playgroud)

这自动const适合您.

  • 为了学习和理解,我可以明白你的观点.目的是让您不要考虑它并专注于您想要做的事情,而不是必须记住地图的value_type.但它只是一个使用的工具.你没必要,如果你不想:) (2认同)