1

我无法理解以下行为。当我使用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

PS:我知道我在这里做的事情可以通过这个设置中的许多其他方式来实现,但这不是实际的程序。这只是我在代码中面临的问题的显式版本。如果有人回答这种方法有什么问题,我将不胜感激。

4

2 回答 2

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]
于 2013-05-31T11:59:43.110 回答
2
map<int, intMap> currPMap = b.at(curr);

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

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

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

于 2013-05-31T12:03:20.973 回答