C++ primer读书笔记——第11章 关联容器

1 关联容器支持高效的关键字查找和访问
2 map 键值对 set仅关键字
3 8个关联容器的3个维度:
①set & map
②关键字重复否 multi
③有序否 unordered_
4 set的成员函数find,如果查找不到元素,返回尾后迭代器
5 关联容器的迭代器都是双向的

11.2.2 定义关联容器

vector<int> ivec;
	for (vector<int>::size_type i = 0; i != 10; i++)
	{
		ivec.push_back(i);
		ivec.push_back(i);
	}
	set<int>iset(ivec.cbegin(), ivec.cend());
	multiset<int>miset(ivec.cbegin(), ivec.cend());
	cout << ivec.size() << endl;  //20
	cout << iset.size() << endl;  //10
	cout << miset.size() << endl; //10

11.2.3 有序关联容器的关键字类型

自定义比较操作

bool cmp(const int a, const int b)
{
	return b < a;
}

int main()
{
	vector <int> vec = { 3,1,9,4,5 };
	sort(vec.begin(), vec.end(),cmp);
	for (vector <int>::iterator it = vec.begin(); it != vec.end(); it++)
		cout << *it << "  ";
	cout << endl;
}

cmp即为自定义比较操作函数
使用关键字类型的比较函数
关联容器的关键字的不能改变的
不对关联容器使用泛型算法

11.3.2 添加元素、删除元素、访问元素

对于包含不重复关键字的容器,只有第一个带有此关键字的元素才被插入到容器中
对于不包含重复元素的容器的insert函数的返回值:返回pair,其first成员是一个迭代器,second成员是bool值,判断元素是否插入

除了顺序容器可以给erase传入迭代器或迭代器对,还可以传入key_value参数,删除所有匹配给定关键字的元素,返回实际删除的元素的个数。

不能对包含重复元素的关联容器执行下标操作,不对set执行下标操作
下标运算符可能插入一个新的元素:如果下标对应的关键字并不在关联容器中,会为它创建一个元素并插入到容器中,并进行值初始化
成员函数at(k):访问关键字为k的元素,返回对应的元素的值;如果k不存在,会抛出out_of_range异常
find() &count():
find判断元素是否存在,如果对应关键字存在,返回指向该关键字对应元素的迭代器;如果不存在,返回尾后迭代器
count统计元素出现次数
lower_bound(k) & upper_bound(k):
lower_bound(k) :返回一个迭代器,指向第一个关键字不小于k的元素;
upper_bound(k):返回一个迭代器,指向第一个关键字大于k的元素;

equal_range():返回一个迭代器pair,表示关键字等于k的元素的范围,若k不存在,pair的两个成员均等于c.end()
在包含重复元素的有序关联容器中查找元素:此类容器具有相同关键字的元素在容器中相邻存储
法一:使用count统计该关键字对应的元素个数,使用find获得指向一个该关键字对应的元素,for循环的迭代次数依赖于count值
法二:使用lower_bound(k) & upper_bound(k),得到具有关键字k的元素的范围
法三:调用equal_range()

11.4 无序容器

无序容器的底层实现机制是hash函数,在存储上组织为一组桶,使用hash函数将元素映射到桶。哈希值相同的元素在一个桶中,关键字相同的元素更在一个桶中。

小结

顺序容器是通过位置访问元素的,关联容器是通过关键字访问元素的。
有序容器元素按顺序(也可以是自定义的顺序)存储。
无序容器中,具有相同关键字的元素也是相邻存储。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值