C++: 关联容器

包括: map, set, multimap, multiset

 

一。pair类型

1. pair<T1, T2> p1. 创建一个空的pair对象,它的两个元素分别是T1和T2类型,比如int, string, 采用值初始化。p1为名字,比如tmp。 

2. pair<T1, T2> p1(v1, v2)

3. make_pair(v1, v2). 以v1和v2值创建一个新的pair对象,其元素类型分别是v1和v2的类型

4. p1 < p2. 如果p1.first < p2.first或者!(p2.first < p1.first) && p1.second < p2.second, 返回true

5. p1 == p2, p1.first == p2.first && p1.second == p2.second.

6. p.first, p.second

 

二。 关联容器操作

1. 构造函数

  C<T> c

  C<T> c1(c2)

  C<T> c(b, e)

2. 关系运算

3. begin, end, rbegin, rend操作

4. swap和赋值操作,没有assign操作

5. clear, erase操作

6. size, empty操作,没有resize操作

 

三。 map

1. 构造函数

  map<k, v> m;

  map<k, v> m(m2);

  map<k, v> m(b, e);

2.    map<K, V>::key_type, 键类型

   map<K, V>::mapped_type 值类型

   map<K, V>::value_type pair类型,first为键类型,second为值类型

3. map添加元素

  两种方法。

      第一种: map<string, int> word_count;

      word_count["anna"] = 1;

  第二种: m.insert(e) e是一个用在m上的value_type类型的值。如果键(e.first)不在m中,则插入一个值为e.second的新元素,如果该键在m中已存在,则保持m不变。该函数返回一个        pair类型对象,包含指向键为e.first的元素的map迭代器,以及一个bool类型的对象,表示是否插入了该元素。

       m.insert(beg, end) beg和end位迭代器,返回void类型

       m.insert(iter, e) 如果键(e.first)不在m中,则创建新元素,并以迭代器iter为起点搜索新元素存储的位置。返回一个迭代器,指向m中具有给定键的元素

                   比如word_count.insert(map<string, int>::value_type("Anna", 1));

       或者word_count.insert(make_pair("Anna", 1));

                   或者typedef map<string, int>::value_type valType;

         word_count.insert(valType("Anna", 1));

       做m.insert(e)操作时返回一个值:包含一个迭代器和一个bool值的pair对象,其中迭代器指向map中具有相应键的元素,而bool值表示是否插入了改元素(如果已经有则是false,如果        没有则为true。比如

       map<string, int> word_count;

       string word;

       while (cin >> word) {

        pair<map<string, int>::iterator, bool> ret = word_count.insert(make_pair(word, 1));

        if (!ret.second) ++ret.first->second;

4. 查找并读取map元素

下标操作符方法比较危险,如果该键不在map容器中,那么下标操作会插入一个具有该键的新元素。推荐使用count或者find.

m.count(k) 返回m中k的出现次数

m.find(k) 如果m容器中存在按k索引的元素,则返回指向该元素的迭代器。如果不存在,则返回超出末端迭代器

比如map<string, int>::iterator it = word_count.find("foobar");

      if (it != word_count.end()) occurs = it->second;

5. 删除元素

m.erase(k) 返回size_type类型值,表示删除的元素个数

m.erase(p) 删除迭代器p所指向的元素。p不能等于m.end()

m.erase(b, e)

 

四。 set

set容器只是单纯的键的集合,支持的操作基本上与map提供的相同

 

五。multimap和multiset

一个键对应多个实例。不能使用下标操作。添加操作总会添加一个元素,删除操作会删除该键的所有元素。

1. 查找元素

第一种方法,用find和count操作,count求出某键出现的次数,find返回一个迭代器,指向第一个拥有正在查找的键的事例,拥有相同键的多个实例相邻存放的。比如

string search_item("Alain de Botton");

typedef multimap<string, string>::size_type sz_type;

sz_type entries = authors.count(search_item);

multimap<string, string>::iterator iter = author.find(search_item);

for (sz_type cnt = 0; cnt != entries; ++cnt, ++iter) 

  cout << iter->second << endl;

第二种方法,使用lower_bound和upper_bound操作。

m.lower_bound(k) 返回一个迭代器,指向键不小于k的第一个元素。

m.upper_bound(k) 返回一个迭代器,指向键大于k的第一个元素

lower_bound返回的迭代器不一定指向拥有特定键的元素。如果该键不在容器中,则lower_bound返回在保持容器元素顺序的前提下该键应被插入的第一个位置。重写上面那段程序为

typedef multimap<string, string>::iterator author_it;

authors_it beg = authors.lower_bound(search_item), end = authors.upper_bound(search_item);

while (beg != end) {

  cout << beg->second << endl;

  ++beg;

}

第三种方法是使用equal_range函数。equal_range函数返回存储一对迭代器的pair对象。如果该值存在,则pair对象中的第一个迭代器指向该键关联的第一个实例,第二个迭代器指向该键关联的最后一个实例的下一个位置。如果找不到匹配的元素,则pair对象中的两个迭代器都将指向此键应该插入的位置。重写程序如下

pair<authors_it, authors_it> pos = authors.equal_range(search_item);

while (pos.first != pos.second) {

  cout << pos.first->second << endl;

  ++pos.first;

}

你可能感兴趣的:(C++)