强制std :: map的键类型不是const

时间:2011-07-21 09:09:38

标签: c++ stl map

C ++引用告诉我们一个std :: map

typedef pair<const Key, T> value_type;

是否可以强制Key Type不是const? 我需要在模板方法中执行此操作,如

template<class T> // T represent a map in general (std::map, boost::unordered_map or whatever..)
void foo(const T& m)
{
  typename T::value_type::first_type x;
  x=0; // Wrong because x is const ...
}

4 个答案:

答案 0 :(得分:15)

不,不是。

这是因为map基于key执行其内部排序。如果你可以自己修改钥匙,不管怎么说,一切都会破坏。

您应该使用提供的API函数;如果使用一个导致更改Key值(实际上我认为没有做任何事情),可能会进行适当的内部重新排序。

考虑getter和setter,以及它们在提供凌乱/危险的直接成员访问的替代方案中的用途。


但是,你可以这样写:

template<class T>
void foo(const T& m)
{
   typename T::key_type x;
   x = 0;
}

std::map类型别名

key_type                Key
mapped_type             T
value_type              pair<const Key,T>
key_compare             Compare
value_compare           Nested class to compare elements
allocator_type          Allocator
reference               Allocator::reference
const_reference         Allocator::const_reference
iterator                Bidirectional iterator
const_iterator          Constant bidirectional iterator
size_type               Unsigned integral type (usually same as size_t)
difference_type         Signed integral type (usually same as ptrdiff_t)
pointer                 Allocator::pointer
const_pointer           Allocator::const_pointer
reverse_iterator        reverse_iterator<iterator>
const_reverse_iterator  reverse_iterator<const_iterator>

答案 1 :(得分:5)

typename T::key_type会在不添加const限定符的情况下为您提供密钥类型。

答案 2 :(得分:4)

以前的答案应该足以满足您的简单问题。作为一种更通用的方法,您可以使用boost::remove_const(来自boost type_traits)将const限定符移除到类型。

template<class T> // T represent a map in general (std::map, boost::unordered_map or whatever..)
void foo(const T& m)
{
  typedef typename T::value_type::first_type X; //is const
  typedef typename boost::remove_const<X>::type NonConstX;
  NonConstX x;
  x=0; 
}

答案 3 :(得分:0)

密钥类型必须是const。如果您确定不会更改地图的顺序,则可以抛弃迭代器的常量。如果你错了,这可能导致丑陋的错误。