最近用到了STL中的map,感觉很方便,而且有点也很多,这里总结一下进来的学习心得。
map是c++的一个标准容器,遇到一对一关系的编程,使用它非常方便。
具体的说map是一类关联式容器,对它进行插入和删除操作时速度快,方便。
使用的时候需要建立起 key和value的对应关系,一个key对应一个value。建立起来之后,可以修改value的值
但不可以再改变key的值。
1,头文件:
#include <map> //STL头文件都没有扩展名.h
using namspace std;
2,定义:map<int,CString> my_map;
如果没有指出命名空间,就需要这样定义:str:map<int,CString> my_map;
这时,int相当于是一个索引,或者理解成数组的下标,每一个int值对应一个CString值
另外对容器的操作,都需要用到对每一对关联的一个指针,就是对条目的定义:
map<int,CString>::iterator item; //在函数的返回值中会用到
4,插入元素:
因为map有key和value的一对一关联关系,那么可以将它看做数组,这样,插入就变得非常简单:
my_map[1]="number 1";
my_map[2]="number 2";
1,2就分别与number 1 , number 2相关联,在my_map中就存在两条记录
这样非常好理解,却存在一个性能上的问题。每插入一个元素,都要先查找map中有没有这个key值的项
如果没有,就插入一个新的项,并先给这个项的第二个元素赋值为空字符串,然后再将它赋值为 number 1
这样就增大了开销
当然,我们也有更好的办法来避免这种开销:使用insert函数
my_map.insert(map<int,CString>::value_type(1,"number 1"));
5,查找元素 find
(记得我们上边定义的item吧)
item = my_map.find(n); //这里的n为int类型,因为my_map是int与CString对应的
if(item == my_map.end()) //说明在my_map中没有找到key值为n的项
{
//do something
}
else //说明找到了key为n 的项
{
//do other thing
}
如果找到了,那么怎么得到这一项的字符串呢,可以使用item
item->first //为key值
item->second //就是我们想要得到的value
6,删除元素 erase
iterator erase(iterator it); //通过一个条目对象删除
iterator erase(iterator first, iterator last); //删除一个范围
size_type erase(const Key& key); //通过关键字删除
例如:item = my_map.erase(n);
my_map.erase(my_map.begin(),my_map.end());