您的位置:首页 > 编程语言 > C语言/C++

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

2017-08-02 20:47 267 查看
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.管理桶

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: