STL关联容器之map

时间:2022-04-12 20:50:59

1、基本概念

  map和set一样,也是一种关联容器,内部也是使用红黑树作为底层的实现结构。但是不同的是,map的键值和实值可以是不一样的。

2、查找操作

  map与set的查找操作本质上是一样的,没有特殊的地方。

3、插入操作

  map使用键值排列元素的位置,因而也不允许插入相同键值的元素,插入算法返回pair(iterator,bool),分别指明插入的节点和插入结果。

4、删除操作

  map与set的删除操作也是一样的,都是使用红黑树的算法。

5、修改算法

  不同于set,map的实值与键值是分离的,因而修改实值的操作是允许的,但是键值是不允许修改的。

6、综合结果

  下面对map的基本用法进行简单的测试,代码如下:

map<int,string> a;
a[1] = "a";
a[5] = "b";
a[7] = "c";

pair<int,string> value(3,"d");
a.insert(value);

for (map<int,string>::iterator iter = a.begin();iter !=a.end();++iter)
{
    cout<<iter->first<<" "<<(iter->second).c_str()<<endl;
    /*1 a 3 d 5 b 7 c */
}

map<int,string>::iterator iter = a.find(8);
if (iter == a.end())
{
    cout<<"key 8 not find the value"<<endl;
}

iter = a.find(3);
if (iter != a.end())
{
    cout<<"key 3 find the value:"<<iter->second.c_str()<<endl;
}

//iter->first = 9; 不可更改
iter->second = "e";
cout<<iter->second.c_str()<<endl; //e

pair<int,string> temp(7,"f");
pair<map<int,string>::iterator,bool> r = a.insert(temp);
cout<<r.second<<endl; //0,不可插入相同键值的元素

a.erase(7);
for (map<int,string>::iterator iter = a.begin();iter !=a.end();++iter)
{
    cout<<iter->first<<" "<<(iter->second).c_str()<<endl;
    /*1 a 3 e 5 b */
}

7、性能分析

  map与set只是满足不同的需求,但是实现原理是一致的,因而性能方面也是一致的。