C++ 关联容器map 类型小结

本网站用的阿里云ECS,推荐大家用。自己搞个学习研究也不错
关联容器与顺序容器

关联容器通过键(key)存储和读取元素,而顺序容器则通过元素在容器中的位置顺序存储和访问元素。

关联容器(Associative containers)支持通过键来高效地查找和读取元素。两个基本的关联容器类型是 map 和 set。 其中map 的元素以键-值(key-value)对的形式组织:键用作元素在 map 中的索引,而值则表示所存储和读取的数据。set 仅包含一个键,并有效地支持关于某个键是否存在的查询。

关联容器类型

一般来说,如果希望有效地存储不同值的集合,那么使用 set 容器比较合适,而 map 容器则更适用于需要存储(乃至修改)每个键所关联的值的情况。在做某种文本处理时,可使用 set 保存要忽略的单词。而字典则是 map 的一种很好的应用:单词本身是键,而它的解释说明则是值。 setmap 类型的对象所包含的元素都具有不同的键,不允许为同一个键添加第二个元素。如果一个键必须对应多个实例,则需使用 multimapmulti set,这两种类型允许多个元素拥有相同的键。

C++ Primer Plus 第6版 中文版 清晰有书签PDF+源代码 http://www.linuxidc.com/Linux/2014-05/101227.htm

读C++ Primer 之构造函数陷阱 http://www.linuxidc.com/Linux/2011-08/40176.htm

读C++ Primer 之智能指针 http://www.linuxidc.com/Linux/2011-08/40177.htm

读C++ Primer 之句柄类 http://www.linuxidc.com/Linux/2011-08/40175.htm

将C语言梳理一下,分布在以下10个章节中:

  1. Linux-C成长之路(一):Linux下C编程概要 http://www.linuxidc.com/Linux/2014-05/101242.htm
  2. Linux-C成长之路(二):基本数据类型 http://www.linuxidc.com/Linux/2014-05/101242p2.htm
  3. Linux-C成长之路(三):基本IO函数操作 http://www.linuxidc.com/Linux/2014-05/101242p3.htm
  4. Linux-C成长之路(四):运算符 http://www.linuxidc.com/Linux/2014-05/101242p4.htm
  5. Linux-C成长之路(五):控制流 http://www.linuxidc.com/Linux/2014-05/101242p5.htm
  6. Linux-C成长之路(六):函数要义 http://www.linuxidc.com/Linux/2014-05/101242p6.htm
  7. Linux-C成长之路(七):数组与指针 http://www.linuxidc.com/Linux/2014-05/101242p7.htm
  8. Linux-C成长之路(八):存储类,动态内存 http://www.linuxidc.com/Linux/2014-05/101242p8.htm
  9. Linux-C成长之路(九):复合数据类型 http://www.linuxidc.com/Linux/2014-05/101242p9.htm
  10. Linux-C成长之路(十):其他高级议题

注意:关联容器根据键排列元素!所以,在迭代遍历访问容器时,是按照键的顺序访问元素,而与元素在容器中的存放位置无关!

基础pair类型

在utility头文件定义。
 

map类型

 

map类型的定义

map 是键-值对的集合。map 类型通常可理解为关联数组(associative array):可使用键作为下标来获取一个值,正如内置数组类型一样。而关联的本质在于元素的值与某个特定的键相关联,而并非通过元素在数组中的位置来获取
 
map对象的构造函数即定义方法:

 
在实际应用中,键类型必须定义 < 操作符,比如list 容器的类型则不能作为键。
在使用关联容器时,它的键不但有一个类型,而且还有一个相关的比较函数。 所用的比较函数必须在键类型上定义严格弱排序(strict weak ordering)。所谓的严格弱排序可理解为键类型数据上的“小于”关系。当用于一个键与自身的比较时,肯定会导致 false 结果。如果它们相互之间都不存在“小于”关系,则容器将之视为相同的键。用做 map 对象的键时,可使用任意一个键值来访问相应的元素。这与下面的添加元素时行为有一定的对应

map定义的类型


 
其中:value_type 是存储元素的键以及值的 pair 类型,而且键为 const

// count number of times each word occurs in the input
map word_count; // empty map from string to int
// get an iterator to an element in word_count
map::iterator map_it = word_count.begin(); // *map_it is a reference to a pair objectcout <
first; // prints the key for this element
cout << " " <
second; // prints the value of the element
 
map_it->first = “new key”;    // error: key is const
 
++map_it->second; // ok: we can change value through an iterator

对迭代器进行解引用将获得一个pair对象,其first成员具有const map::key_type 类型即存放键,而 second成员则为map::mapped_type 类型,即存放值。

map元素添加

一、下标添加

当编写以下代码时:

map word_count; // empty map
// insert default initialzed element with key Anna; then assign 1 to its value
word_count[“Anna”] = 1;

将发生:

1.在 word_count 中查找键为 Anna 的元素,没有找到。
2.将一个新的键-值对插入到 word_count 中。它的键是 const string 类型的对象,保存 Anna。而它的值则采用值初始化,这就意味着在本例中值为 0。
3.将这个新的键-值对插入到 word_count 中。
4.读取新插入的元素,并将它的值赋为 1。

使用下标访问 map 与使用下标访问数组或 vector 的行为截然不同:用下标访问不存在的元素将导致在 map 容器中添加一个新元素,它的键即为该下标值。

PS:下标操作符返回值的使用
通常来说,下标操作符返回左值。它返回的左值是特定键所关联的值。可如下读或写元素:

// count number of times each word occurs in the input
map word_count; // empty map from string to int   
string word;
while (cin >> word)
  ++word_count[word];

二、insert添加

map上的insert操作

1.添加元素

// if Anna not already in word_count,inserts new element with value 1
word_count.insert(map::value_type(“Anna”, 1));

上面语句的实参可以简化如下两种方法:

(1) word_count.insert(make_pair(“Anna”, 1));
(2)使用 typedef

    typedef map::value_type valType;
    word_count.insert(valType(“Anna”, 1));

2、insert的返回值

There can be only one element with a given key in a map. If we attempt to insert an element with a key that is already in the map, then insert does nothing. The versions of insert that take an iterator or iterator pair do not indicate whether or how many elements were inserted.
但是,带有一个键-值 pair 形参的 insert 版本将返回一个值:包含一个迭代器和一个 bool 值的 pair 对象其中迭代器指向 map 中具有相应键的元素,而 bool 值则表示是否插入了该元素。如果该键已在容器中,则其关联的值保持不变,返回的 bool 值为 false。在这两种情况下,迭代器都将指向具有给定键的元素。

查找以及读取map中的元素

一、下标读取

  map word_count;
  int occurs = word_count[“foobar”];

但是:使用下标存在一个很危险的副作用:如果该键不在 map 容器中,那么下标操作会插入一个具有该键的新元素。</

未经允许不得转载:演道网 » C++ 关联容器map 类型小结

赞 (0)
分享到:更多 ()

评论 0

评论前必须登录!

登陆 注册