set, map

本文深入探讨了C++标准模板库中的set和map容器,详细介绍了它们的特性和使用方法,包括排序、键值对、插入、查找和删除操作。同时,对比了set与map的区别,如是否允许重复键、底层实现等,并通过实例展示了如何在实际编程中应用这些容器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  set的特性是, 所有元素都会根据键值自动被排序,set的元素不像map那样可以同时拥有实值(value)和键值(key),set元素的键值就是实值,实值就是键值,并且不允许两个元素有相同的键值, 但multiset允许相同键值。

  set的元素值不可以通过迭代器改变,因为其元素值就是键值,关系到set的排列规则。在源代码中,set<T>::iterator被定义为底层RB-tree的const_iterator,杜绝写入操作。

  set的底层机制其实就是RB-tree(SGI还提供另一种以hash-table为底层机制的set,称为hash_set),几乎所有set的操作都是转调用rb_tree的操作,由于不允许重复键值,所以一定是使用rb_tree的insert_unique()而不能用insert_equal()。

  set缺省情况采用递增排序。

int i;
int ia[5] = { 0, 1, 2, 3, 4};
set<int> iset(ia, ia+5);
cout<<iset.size()<<endl;	// 5,size()获取窗口的元素个数
cout<<iset.count(3)<<endl;	// 1,count(const key_type&x)获取键值为x的元素个数
iset.insert(3);			// 由于不允许重复元素,所以insert()调用失败
cout<<iset.size()<<endl;	// 5
iset.insert(5);
cout<<iset.size()<<endl;	// 6
iset.erase(1);
cout<<iset.size()<<endl;	// 5

it1 = find(iset.begin(), iset.end(), 3);// 可以用STL算法find()来搜寻元素,但效率不是最佳的
set<int>::iterator it1 = iset.find(3);	// 对于关联式容器,应该使用容器提供的find函数来搜索
it1 = find(iset.begin(), iset.end(), 3);



  map的特性是,所有元素都会根据元素的键值自动被排序,map的所有元素都是pair,同时拥有实值(value)和键值(key)。pair的第一个元素被视为键值,第二个元素被视为实值。map不允许相同键值,但multimap允许相同键值。

  map的底层机制和set一样,也是rb_tree,所以用法也是类似的,就不多说了。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值