我无法理解以下行为。当我使用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。:我知道我在这里做的事情可以通过此设置中的许多其他方式实现,但这不是实际的程序。这只是我在代码中遇到的问题的显式版本。如果有人回答了这种方法的错误,我将不胜感激。
答案 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);
^
请注意,如果向向量添加或删除元素,则引用可能无效,因为向量需要移动其元素以维持连续的数组。