C++ Primer 笔记——关联容器

1.关联容器支持高效的关键字查找和访问,标准库提供8个关联容器。

2.如果一个类型定义了“行为正常”的 < 运算符,则它可以用作关键字类型。

3.为了使用自己定义的类型,在定义multiset时必须提供两个类型:自定义类类型以及比较操作类型(函数指针)。

class test
{
public:
    test(int i) { m_id = i; }
    int m_id;
};

bool compare_test(const test& t1, const test& t2)
{
    return t1.m_id > t2.m_id;
}

std::multiset<test> test_set0;
//test_set0.insert(test(5));        // 错误,test没有<运算符操作

std::multiset<test, decltype(compare_test)*> test_set(compare_test);    // 构造函数里的compare_test可以写成&compare_test
test_set.insert(test(5));    // 正确
test_set.insert(test(4));    // 如果test_set的构造函数参数里没有compare_test,插入第二个元素就会报错,因为调用了一个空指针函数来比较
    

4.pair的默认构造函数会对成员进行初始化。pair有如下操作:

5.关联容器定义了额外的类型别名:

一个map的value_type是一个pair,我们可以改变pair的值,但不能改变关键字成员的值。

6.虽然set定义了 iterator 和 const_iterator 但是都是只读的,和map的关键字一样不允许修改。

7.由于map和set包含不重复的关键字,因此插入一个已存在的元素对容器没有任何影响。

8.关联容器的insert操作:

对于不包含重复关键字的容器,添加单一元素的insert和emplace版本返回一个pair,pair的first是一个迭代器。指向具有给定关键字的元素,second是一个bool值,指出是插入成功还是已存在。

9.关联容器的删除操作:

  • 对于保存不重复关键字的容器,erase的返回值总是0或1,若返回0.则表面想要删除的元素并不在容器中。
  • 对于重复关键字的容器,删除元素的数量可能大于1。

10.关联容器的下标操作:

  • 当对一个map进行下标操作时,会获得一个mapped_type对象,但当解引用一个map迭代器时,会得到一个value_type对象。
  • map的下表运算符返回一个左值,既可以读也可以写。

11.查找元素的操作:

后面三个方法如果没有找到指定元素,则迭代器指向一个此元素可以插入的位置。

12.新标准定义了4个无序关联容器,这些容器不是使用比较运算符来组织元素,而是使用一个哈希函数和关键字类型的==运算符。如果关键字类型固有就是无序的,或者性能测试发现问题可以用哈希技术解决,就可以使用无序容器。

13.管理桶

原文地址:https://www.cnblogs.com/zoneofmine/p/7265863.html