C++ map基础知识: http://www.cnblogs.com/mattins/p/3531362.html这个最全,关于map排序
1,map是一类关联式容器。它的特点是增加和删除节点对迭代器的影响很小,除了那个操作节点,对其他的节点都没有什么影响。对于迭代器来说,可以修改实值,而不能修改key。(http://www.oschina.net/question/234345_48876)
2, map能做到快速遍历所有值,实现查找,删除等操作。
3,std:map<int, string> personnel; 定义了一个用int作为索引,并拥有相关联的指向string的指针.
可以使用typedef 定义某个map (eg: typedef std:map<int, string> intStringMap )
4, map中插入类对象,若使用
class mapTest(){};
map<int, mapTest> mapClass;
mapClass[2] = xxxx;
这时插入值的过程如下:在mapClass中找 key==2 的项, 若没有, 插入一个新的map对象,其 key = 2; value = NULL;完成后再将xxxx赋值给value。这样开销大。
可以使用insert插入当前map中没有的key和value, 如果当前map中已经存在,则只能用下标操作符插入,因为下标操作符可用来读取 key 和 value ,如果当前map没有需要查找的key, 则创建一个新key,value = NULL。。
mapClass.insert(map<int, mapTest> :: value_type(2, xxxx)); //插入value_type数据
或直接插入pair数据: mapClass.insert(pair<int, mapTest>(2, xxxx)); // 插入pair数据
可以用pair来检查是否插入成功:
Pair<map<int, mapTest>::iterator, bool> Insert_Pair;
Insert_Pair = mapClass.insert(map<int, mapTest>::value_type (1, “student_one”)); 插入成功返回true, 否则返回0
Int nSize = mapClass.size(); 可以用来看当前map中有多少数据。
其它示例:
map<string, int> mapTest; // 定义了一个空的map对象word_count;
mapTest["Anna"] = 1; //给key为Anna的key赋值value为1;
5, 在map中查找获取某个元素用find,可以用来判断某个元素是否在map中存在,返回值类型是iterator:
第一种方法是用count,返回值只有 true or fauls, 无法定位;
int findCount;
mapTest nn;
if ( mapClass.count(2) )
nn = mapClass[2] ;
else
cout << " not exist key 2 " << endl;
第二种用find:
int findKey = 2;
map<int, mapTest>::iterator it= mapClass.find(findKey);
if ( it != mapClass.end){
cout << "Not find " << it->first << endl;
}
其中 it->first == key it->seconde == value
通过map对象的方法获取的iterator数据类型是一个std::pair对象,包括两个数据 iterator->first 和 iterator->second 分别代表关键字和存储的数据
6, 从map中删除元素:
移除某个map的元素用erase()
iterator erase(iterator it); //通过一个条目对象删除
iterator erase(iterator first, iterator last); //删除一个范围
size_type erase(const Key& key); //通过关键字删除
clear()就相当于 enumMap.erase(enumMap.begin(), enumMap.end());
empty()函数可以判断map是否被清空,返回true则是空map
7, 迭代输出map中所有元素
a:使用正向迭代器:
for(iter = mapClass.begin(); iter != mapClass.end(); iter++) { Cout<<iter->first<<” ”<<iter->second<<end; }b:使用反向迭代器:
for(iter = mapClass.rbegin(); iter != mapClass.rend(); iter++) { Cout<<iter->first<<” ”<<iter->second<<end; }
map 的其它操作:
map 的继承:
map不宜继承, STL的析构函数不是虚的. 如果使用了继承, 也许现在没事, 但迟早会有事的.
如果用包含,自己在类中定义接口,转发给map, 那么map的方法就会全被隐藏, 若想在map方法保留的前提下扩展些自定义方法呢?