最近在阅读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 -------------------]