Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 别名用于不修改STL容器的实际内容_C++_Stl_Reference - Fatal编程技术网

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

C++ 别名用于不修改STL容器的实际内容,c++,stl,reference,C++,Stl,Reference,我无法理解以下行为。使用currPMap修改值时,实际位置的值不会被修改。为什么会这样 我用引用检查了操作符[]和at return引用,因此这应该是有效的 #include <iostream> #include <vector> #include <map> using namespace std; typedef map<int, int> intMap; typedef map<int, int>::iterator map

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

我用引用检查了操作符[]和at return引用,因此这应该是有效的

#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;
}
附言:我知道我在这里所做的事情可以通过许多其他方式在这个环境中实现,但这不是实际的计划。这只是我的代码所面临问题的明确版本。如果有人回答此方法中的错误,我将不胜感激。

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

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

您需要的是参考资料:

map<int, intMap>& currPMap = b.at(curr); // currMap refers to b[0]
因为您在此处获得的是地图的副本,而不是别名:

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

您需要的是参考资料:

map<int, intMap>& currPMap = b.at(curr); // currMap refers to b[0]
那不是别名,也不是参考;那是副本。如果需要引用,则需要声明它:

map<int, intMap> & currPMap = b.at(curr);
                 ^
请注意,如果向向量添加或删除元素,则引用可能无效,因为向量需要移动其元素以保持连续数组

那不是别名,也不是参考;那是副本。如果需要引用,则需要声明它:

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

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

此网站说,在返回引用时@AmandepGautam完全正确,这就是为什么可以将返回值分配给引用。但是你在复印。我有点困惑。那么为什么编译器没有显示我所做的任何错误/警告消息呢。对吗。如果是,那么如何。对不起,我有一个问题comments@AmanDeepGautam因为您可以从对其他对象的引用复制对象。这两个版本都是正确的,它们只是做了不同的事情。所以这类似于我们在指针的情况下使用的*去引用操作符。我是对的。这个网站说,在返回一个参考@AmandepGautam完全正确,这就是为什么可以将返回值分配给引用。但是你在复印。我有点困惑。那么为什么编译器没有显示我所做的任何错误/警告消息呢。对吗。如果是,那么如何。对不起,我有一个问题comments@AmanDeepGautam因为您可以从对其他对象的引用复制对象。这两个版本都是正确的,它们只是做了不同的事情。所以这类似于我们在指针的情况下使用的*去引用操作符。我说得对吗。
map<int, intMap> & currPMap = b.at(curr);
                 ^