C++STL 之 Map

最近在阅读MyTinySTL源码,没有往深入里面研究,主要看各种容器的用法和区别,以此加深对各容器的熟悉程度。在博客上主要也是记录部分代码和运行效果,作为笔记日后可复习。

下面是C语言中文网对于map的描述,这里只摘取其中一段。具体的内容请看链接http://c.biancheng.net/view/391.html

map 是关联容器的一种,map 的每个元素都分为关键字和值两部分,容器中的元素是按关键字排序的,并且不允许有多个元素的关键字相同。

注意,不能直接修改 map 容器中的关键字。因为 map 中的元素是按照关键字排序的,当关键字被修改后,容器并不会自动重新调整顺序,于是容器的有序性就会被破坏,再在其上进行查找等操作就会得到错误的结果。

要使用 map,必须包含头文件 <map>。map 的定义如下:

template < class Key, class T, class Pred = less<Key>, class A = allocator<T> >
class map{
    ...
    typedef pair< const Key, T > value_type;
    ...
};

map 和 multimap 十分类似,区别在于 map 容器中元素的关键字不能重复。multimap 有的成员函数,map 都有。此外,map 还有成员函数 operator[]:

T & operator[] (Key k);

该成员函数返回 first 值为 k 的元素的 second 部分的引用。如果容器中没有元素的 first 值等于 k,则自动添加一个 first 值为 k 的元素。如果该元素的 second 成员变量是一个对象,则用无参构造函数对其初始化。

以下是map类测试部分代码,主要是map对象的定义

#define PAIR    mystl::pair<int, int>

std::cout << "[===============================================================]" << std::endl;
  std::cout << "[------------------ Run container test : map -------------------]" << std::endl;
  std::cout << "[-------------------------- API test ---------------------------]" << std::endl;
  mystl::vector<PAIR> v;
  for (int i = 0; i < 5; ++i)
    v.push_back(PAIR(i, i));
  mystl::map<int, int> m1;
  mystl::map<int, int, mystl::greater<int>> m2;
  mystl::map<int, int> m3(v.begin(), v.end());
  mystl::map<int, int> m4(v.begin(), v.end());
  mystl::map<int, int> m5(m3);
  mystl::map<int, int> m6(std::move(m3));
  mystl::map<int, int> m7;
  m7 = m4;
  mystl::map<int, int> m8;
  m8 = std::move(m4);
  mystl::map<int, int> m9{ PAIR(1,1),PAIR(3,2),PAIR(2,3) };
  mystl::map<int, int> m10;
  m10 = { PAIR(1,1),PAIR(3,2),PAIR(2,3) };

以下是运行后的效果

[===============================================================]
[------------------ Run container test : map -------------------]
[-------------------------- API test ---------------------------]
 After m1.emplace(i, i) :
 m1 : <5,5>
 After m1.emplace(i, i) :
 m1 : <4,4> <5,5>
 After m1.emplace(i, i) :
 m1 : <3,3> <4,4> <5,5>
 After m1.emplace(i, i) :
 m1 : <2,2> <3,3> <4,4> <5,5>
 After m1.emplace(i, i) :
 m1 : <1,1> <2,2> <3,3> <4,4> <5,5>
 After m1.emplace_hint(m1.begin(), 0, 0) :
 m1 : <0,0> <1,1> <2,2> <3,3> <4,4> <5,5>
 After m1.erase(m1.begin()) :
 m1 : <1,1> <2,2> <3,3> <4,4> <5,5>
 After m1.erase(0) :
 m1 : <1,1> <2,2> <3,3> <4,4> <5,5>
 After m1.erase(1) :
 m1 : <2,2> <3,3> <4,4> <5,5>
 After m1.erase(m1.begin(), m1.end()) :
 m1 :
 After m1.insert(PAIR(i, i)) :
 m1 : <0,0>
 After m1.insert(PAIR(i, i)) :
 m1 : <0,0> <1,1>
 After m1.insert(PAIR(i, i)) :
 m1 : <0,0> <1,1> <2,2>
 After m1.insert(PAIR(i, i)) :
 m1 : <0,0> <1,1> <2,2> <3,3>
 After m1.insert(PAIR(i, i)) :
 m1 : <0,0> <1,1> <2,2> <3,3> <4,4>
 After m1.insert(v.begin(), v.end()) :
 m1 : <0,0> <1,1> <2,2> <3,3> <4,4>
 After m1.insert(m1.end(), PAIR(5, 5)) :
 m1 : <0,0> <1,1> <2,2> <3,3> <4,4> <5,5>
 m1.count(1) : 1
 *m1.find(3) : <3,3>
 *m1.lower_bound(3) : <3,3>
 *m1.upper_bound(2) : <3,3>
 m1.equal_range(2) : from <2, 2> to <3, 3>
 After m1.erase(m1.begin()) :
 m1 : <1,1> <2,2> <3,3> <4,4> <5,5>
 After m1.erase(1) :
 m1 : <2,2> <3,3> <4,4> <5,5>
 After m1.erase(m1.begin(), m1.find(3)) :
 m1 : <3,3> <4,4> <5,5>
 After m1.clear() :
 m1 :
 After m1.swap(m9) :
 m1 : <1,1> <2,3> <3,2>
 *m1.begin() : <1,1>
 *m1.rbegin() : <3,2>
 m1[1] : 1
 After m1[1] = 3 :
 m1 : <1,3> <2,3> <3,2>
 m1.at(1) : 3
 m1.empty() : false
 m1.size() : 3
 m1.max_size() : 18446744073709551615
[ PASSED ]
[--------------------- Performance Testing ---------------------]
|---------------------|-------------|-------------|-------------|
|       emplace       |    100000   |   1000000   |  10000000   |
|         std         |     57ms    |   1832ms    |  39465ms    |
|        mystl        |    255ms    |   4831ms    |  52907ms    |
|---------------------|-------------|-------------|-------------|
[ PASSED ]
[------------------ End container test : map -------------------]

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值