std::map的使用

  • Post author:
  • Post category:其他


map是一种字典存储<key,value>型数据,map里存放的必须是pair模板类的对象,因为pair模板中的first就是key,second就是value。

pair模板在STL种的定义很复杂,我只了解了如何创建pair对象和提供了哪些接口。


1、创建pair对象

std::pair<K, V> element;
std::pair<K, V> element(x,y);
std::pair<K, V> element(theElement)

语句一调用默认构造函数创建了pair类对象element,没有赋值。语句二调用构造函数创建了element对象并初始化了值。语句三调用复制构造函数。

要想改变pair对象的值可直接对first,second赋值,也可使用pair中的赋值运算符“=”,或swap成员函数。

std::make_pair<K,V>(x,y);

make_pair也可用来创建pair对象。K,V可以缺省,自动根据x,y类型确认K,V。


2,创建容器map

std::map<K,V,std::less<K> > L;

其中K,V指定了键的类型和值的类型,std::less是map默认使用的排序方法(不写第三个参数,就使用std::less)。在stl中是这样定义less的

template<class _Ty = void>
 struct less
 { // functor for operator<
 typedef _Ty first_argument_type;
 typedef _Ty second_argument_type;
 typedef bool result_type;

 constexpr bool operator()(const _Ty& _Left, const _Ty& _Right) const
  { // apply operator< to operands
  return (_Left < _Right);
  }
 };

其中重载的()是关键,在stl中元素是按照key从小到大排序的,如果想从大到小排序,就可以仿照less定义myless

template<class _Ty = void>
 struct less
 { // functor for operator<
 typedef _Ty first_argument_type;
 typedef _Ty second_argument_type;
 typedef bool result_type;
 constexpr bool operator()(const _Ty& _Left, const _Ty& _Right) const
  { // apply operator< to operands
  return (_Left > _Right);
  }
 };
 std::map<K,V,myless<K> > L;

L中元素就是按key从大到下排序了,如果key不是基本类型,key中必须重载<。


3、容器map的相关操作。


1、at和下标运算符 [ ]

与顺序容器不同的是at和 [ ]中放的是键值key,根据key去找元素,而不是根据序号 i。

而且返回值是V型值,不是pair类型。

有人可能会问,如果有key值相同,但value值不同的元素,返回哪一个呢?其实map中不允许有key值相同的pair对象,如果插入一个已经存在的key值,根本插不进去,不会报错,但map不会改变。

2、begin()、end()、rbegin()、rend()

上面说at和[ ]只能根据键值查找,但如果希望获得第…个元素,就需要用到迭代器。

begin()返回第一个元素的迭代器

end() 返回最后一个元素,下一个位置处的迭代器(没有元素)

rbegin() 返回最后一个元素的迭代器(reverse_iterator)不同于iterator,不可作为erase的参数。

rend() 返回第一个元素前面位置的迭代器

3、insert()和 [ ]

insert的参数是pair对象

`s.insert(std::make_pair(1, 100));

[ ]也可以用来插入,

element[1]=100

,如果键值1存在,则直接修改value。如果键值不存在,则创建一个pair对象。

4、erase()

当参数是键值,返回值是bool类型,如果键值存在,则删除成果返回1.不存在,则删除失败返回0。

当参数是迭代器时,返回值是下一个位置的迭代器。

erase(begin())是对的

erase(rbegin())是错的

erase(rbegin()->first)是对的

5、find()

参数是键值,返回值是迭代器。find和at适合查找,insert和

[ ]适合插入。

总结:map不存在下标i,只存在迭代器和键值。



版权声明:本文为qq_45100518原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。