std :: map <std :: vector <int>中的“强制constness”,double&gt; &GT; </标准::矢量<int>的

时间:2010-04-23 06:51:46

标签: c++

考虑这个程序:

#include <map>
#include <vector>
typedef std::vector<int> IntVector;
typedef std::map<IntVector,double> Map;
void foo(Map& m,const IntVector& v)
{
   Map::iterator i = m.find(v);
   i->first.push_back(10);
};
int main()
{
   Map m;
   IntVector v(10,10);
   foo(m,v);
   return 0;
}

使用g ++ 4.4.0,我得到了他的编译错误:

test.cpp: In function 'void foo(Map&, const IntVector&)':
test.cpp:8: error: passing 'const std::vector<int, std::allocator<int> >' as 'this' argument of 'void std::vector<_Tp, _Alloc>::push_back(const _Tp&) [with _Tp = int, _Alloc = std::allocator<int>]' discards qualifiers

如果我在foo中使用Map::const_iterator但不使用非const迭代器,我会期待这个错误。

我错过了什么,为什么会收到此错误?

1 个答案:

答案 0 :(得分:6)

地图中的键是不变的。地图是一棵树,你不仅可以绕过改变键,也可以打破它的不变量。 value_typeKey地图的Valuestd::pair<const Key, Value>,以强制执行此操作。

您的设计需要一些变化。如果您确实需要修改密钥,则需要删除该元素,更改其密钥,然后使用新密钥重新插入该密钥。

另外,关于您的示例,您将获得未定义的行为(如果这确实有效)。当您致电foo时,您的地图为空,因此find返回的迭代器将为m.end();该元素不存在。但接下来你会继续修改这个不存在的元素:ka-boom。每当你find某事时,你应该在尝试使用之前检查它是否已找到。