别名用于不修改STL容器的实际内容

时间:2013-05-31 11:57:59

标签: c++ stl reference

我无法理解以下行为。当我使用currPMap修改值时,不会修改实际位置的值。为什么会这样。

我使用引用检查了operator[]at()返回引用,因此这应该有效。

#include <iostream>
#include <vector>
#include <map>

using namespace std;

typedef map<int, int> intMap;
typedef map<int, int>::iterator mapIt;

int main(void) {
    vector< map<int, intMap > > b(2);
    int curr=0, next=1;
    map<int, intMap> currPMap = b.at(curr);
    (currPMap[4])[2] = 3;    //modified by currPMap.
    cout<<((b.at(curr))[4])[2]<<endl;
    ((b.at(curr))[4])[2] = 3;    //modified using the actual vector.
    cout<<((b.at(curr))[4])[2]<<endl;
}

输出:

0
3

P.S。:我知道我在这里做的事情可以通过此设置中的许多其他方式实现,但这不是实际的程序。这只是我在代码中遇到的问题的显式版本。如果有人回答了这种方法的错误,我将不胜感激。

2 个答案:

答案 0 :(得分:5)

因为您在此处获取地图的副本,而不是别名

map<int, intMap> currPMap = b.at(curr); // currMap is a copy of b[0]

然后修改副本,而不是存储在矢量中的地图。

您需要的是参考:

map<int, intMap>& currPMap = b.at(curr); // currMap refers to b[0]

答案 1 :(得分:2)

map<int, intMap> currPMap = b.at(curr);

这不是别名(又名参考);那是副本。如果你想要一个参考,你需要这样声明:

map<int, intMap> & currPMap = b.at(curr);
                 ^

请注意,如果向向量添加或删除元素,则引用可能无效,因为向量需要移动其元素以维持连续的数组。