声明:这篇文章中有参考引用(已表明)。
1、map中添加元素
首先map中的键值(key)存入的时候是以常量的类型存入的,我们可以从map的成员函数value_type看出。
typedef pair<const Key, Type> value_type;(A type that represents the type of object stored as an element in a map.)
所以接下来的几中添加元素的方式就需要注意了:
map<string, int> grade_map;
① grade_map.insert(pair<string, int>("Math", 90));//添加元素时需要强转
② grade_map.insert(make_pair("Chinese", 88));//添加元素时需要强转
③ grade_map.insert(map<string, int>::value_type("English", 85));//添加元素时不需要强转
④ grade_map["C++"] = 90;//添加元素时需要强转
注意: 如果map中已经有了对应key,那么insert操作将失败,也不会给此键值对应的映射value赋值。
但是第④种方式有所不同,没有此键值则添加,有此键值则重新赋值。
map中的2个值:key_type;(键值)
value_type;(pair对)
2、map中删除元素
map::erase(); 删除指定元素或者指定范围元素。
map::clear();删除所有元素。
map<string, int>::iterator itr = grade_map.begin();
while (itr != grade_map.end())
{
if ("Math" == itr->first)
{
grade_map.erase(itr++);//先对迭代器加1,然后再删除。这样可以防止迭代器失效
}
else
itr++;
}
注意:map中删除元素时,只是当前迭代器失效。
3、map常用函数
begin();end();
find();没找到返回尾后迭代器,找到了返回对应键值的迭代器。
empty();为空,返回true。
count(key);有对应元素返回1,没有对应元素返回0。
size();返回当前map中元素的个数。
4、运用map[ ](插入运算符),(顾名思义这个运算符最好用在插入软塑时)
map[key ],如果没有此键值,则在对应键值位置构造一个默认初始化的value。
所以用这个插入符取值的时候,首先要判断map中是否有此键值,在有的情况下使用比较安全。
如:(下面这一段是参考别人的,没有找到原创地址,就加一个转载地址吧:http://blog.csdn.net/nxx_168/article/details/7670757)
str_map[5] = "ee";
这条语句实际上是分两个步骤执行的:
先在str_map[5]的地方构造一个空string,然后通过str_map[5]返回这个string的reference;
然后调用这个空string的assignment运算符,把"ee"赋给它。
因此,这样写要比直接insert效率低些。
索引还有一个问题是需要注意的:
map<int, string> m;
cout<<m.size()<<endl; // output: 0
if ( m[4] == "aa" )
some_operation();
cout<<m.size()<<endl; //output: 1
这里m[4]已经指向了一个构造好了的空string