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()); // 正确
test_set.insert(test()); // 如果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.管理桶