C++ Primer 有感(标准库map类型)
map是键-值对的集合。map类型通常可以理解为关联数组:可以使用键作为下标获取一个值,正如内置数组一样。而关联的本质在于元素的值于某个特定的键相关联,而并非通过元素在数组中的位置获取。
1.map对象的定义
要使用map对象,则必须包含map头文件。在定义map对象时,必须分别指明键和值得类型
map<string,int> word_count;
string为键,int为值
map的构造函数
map<k,v> m; //创建一个名为m的空map对象,其键和值得类型分别为k和v
map<k,v> m(m2); //创建m2的副本m,m与m2必须有相同的键类型和值类型
map<k,v> m(b,e) //创建map类型的对象m,存储迭代器b和e标记范围内所有元素的副本。元素的类型必须能转换为pair<const k,v>。
2.map定义的类型
map<k,v>::key_type 在map容器中用作索引的键的类型
map<k,v>::maped_type 在map容器中,键所关联的值得类型
map<k,v>::value_type 一个pair类型,它的first元素具有const map<k,v>::key_type类型,而second元素则为map<k,v>::maped_type类型。
对map迭代器进行解引用将获得一个pair对象,它的first成员存放键,为const,而second成员则存放值。
3.给map添加元素
与其他下标操作符一样,map的下标也是使用索引获取该键关联的值。如果该键在容器中,则map的下标运算与vector的下标元素一样:返回该键所关联的值。只有在所查的键不存在是,map容器才为该键创建一个新的元素,并将它插入到此map对象中。此时,所关联的值采用值初始化:类类型的元素用默认的构造函数初始化,而内置类型的元素则初始化为0。
map容器提供的insert操作
m.insert(e) e是在m上的value_type类型的值。如果键(e.first)不在m中,则插入一个e.second的新元素;如果该键在m中已经存在,则保持m不变。该函数返回一个pair类型对象,包含指向键为e.first的元素的map迭代器,以及一个bool类型的对象,表示是否插入了该元素
m.insert(beg,end) 迭代器之间的元素必须为value_type类型的键-值对。在该范围内的元素,如果不在m中,则插入。
m.insert(iter,e) 从迭代器iter开始寻找,不存在m中则插入,返回迭代器,指向m中具有指定键的元素
word_count.insert(map<string,int>::value_type("Anna",1));
也可以简化为 word_count(make_pair("Anna",1));
使用第一种方法插入返回的是pair类型。
pair<map<string,int>::iterator,bool> ret=word_count.insert(map<string,int>::value_type("Anna",1));
4.查找并获取map中的元素
使用下标获取map中国的值,如果该键不存在,则插入了显得元素。下面map提供了两个操作
m.count(k) 返回m中k出现的次数
m.find(k) 存在则返回指向该元素的迭代器,否则返回超出末端迭代器
对于map,count的返回值只可能是0或者1,通过该函数就可以知道是否存在,然后使用下标操作,则不会出现不存在则插入新元素的问题。
对于find函数,通过判断是否与超过末端的迭代器相等判断是否存在,若存在则使用返回的迭代器,该返回的迭代器是pair类型,通过下面的方法获得值int value=iter->second;
5.从map中删除元素
m.erase(k) 删除m中键为k的元素。返回size_type类型的值,表示删除元素的个数
m.erase(p) 从m中删除迭代器p所指向的元素。p必须指向m中确实存在的元素,而且不能等于m.end()。返回void类型
m.erase(b,e) 从m中删除一段范围内的元素,该范围由迭代器对b和e标记。b和e必须标记m中一段有效范围:即b和e都必须指向m中的元素或者最后一个元素的下一个位置。而且b和e要么相等(此时删除的范围为空),要么b指向的元素必须出现在e所指向的元素之前。返回void类型。
除此之外,map还提供一种特殊的erase操作,其参数是key_type类型的值,如果拥有该元素的键存在,则删除该元素,返回删除的个数。对于map来说,返回值为1或者0。0表示表示删除的元素在map中不存在。
对于map对象的遍历,可以使用迭代器,m.end()和m.begin()。