行业知识
【C++】--- STL之 set 和 map
2026-11-07 00:41:26
来源:互联网转载
【C++】--- STL之 set 和 map
- 一、关联式容器和键值对
- 1.关联式容器
- 2.键值对
- 二、set
- 1.set特点
- 2.set类
- (1) set类对象构造
- (2)insert插入
- (3)set遍历
- (4)find查找
- (5)erase删除
- (6)计数count( )
- (7)交换swap( )
- (8)清空所有元素clear( )
- (9)求set的元素个数size( )
- 三、map
- 1.map特点
- 2.map类
- (1)map类的构造
- (2)插入insert( )
- (3)map遍历
- (4)删除erase( )
- (5)查找find()
- (6)operator[ ](重要)
- 四、multiset 和 multimap
一、关联式容器和键值对
1.关联式容器
(1)序列式容器:因为底层的数据结构是线性的,所以称它为序列式容器,比如说vector list deque 等等…
(2)关联式容器:也是用来存储数据的,与序列式容器不同的是,其里面存储的是结构的键值对,在数据检索时比序列式容器效率更高。
2.键值对
什么叫做键值对???
用来表示具有一一对应关系的一种结构,该结构中一般只包含两个成员变量key和value,key代表键值,value表示与key对应的信息。
比如:现在要建立一个英汉互译的字典,那该字典中必然有英文单词与其对应的中文含义,而且,英文单词与其中文含义是一一对应的关系,即通过该应该单词,在词典中就可以找到与其对应的中文含义。
库中对 键值对的定义·:pair (first = key second = value)
template struct pair {typedef T1 first_type;typedef T2 second_type;T1 first;T2 second;pair(): first(T1()), second(T2()){} pair(const T1& a, const T2& b): first(a), second(b){}};二、set
1.set特点
- set是按照一定次序存储元素的容器
- 在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。
- 在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。
- set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对子集进行直接迭代。
- set在底层是用二叉搜索树(红黑树)实现的。
2.set类
(1) set类对象构造
template class set; //构造setexplicit set (const key_compare& comp = key_compare(), const allocator_type& alloc = allocator_type());template //使用迭代器区间构造setset (InputIterator first, InputIterator last, const key_compare& comp = key_compare(), const allocator_type& alloc = allocator_type()); //拷贝构造setset (const set& x);
(2)insert插入
(1)创建set对象:
#include#includeusing namespace std;void test_set1(){set s;// 构造一个set对象set s1(s.begin(), s.end());// 迭代器区间构造set s2(s1);// 拷贝构造}(2)插入insert:
s.insert(1);s.insert(1);s.insert(9);s.insert(3);s.insert(7);s.insert(5);
set的作用:排序+去重
(3)set遍历
(1)迭代器区间遍历:
// 遍历set::iterator it = s.begin();while (it != s.end()){cout cout cout cout s.erase(ret);} for (auto e : s){cout cout cout cout cout cout map "left","左边" });// 4、多参数的构造函数,支持隐式类型转换(C++11 常用!!!)//}int main(){//test_set1();test_map();return 0;}cout cout mapm.erase(pos);}return 0;}cout cout cout cout string arr[] = { "苹果", "西瓜", "苹果", "西瓜", "苹果", "苹果", "西瓜","苹果", "香蕉", "苹果", "香蕉","苹果","草莓", "苹果","草莓" };map//// 这里的map对象:countMap是 一边遍历,一边插入形成二叉搜索树!//auto it = countMap.find(e);//if (it != countMap.end())// 如果在二叉搜索树里面没有找到 就会返回countMap的end()//{//it-second++; // 找到了,second++//}//else//{//countMap.insert({ e,1 }); // 没有找到就初始化 1//}//}// 法2:operator[]的运用!(传参传的是key,返回的是val&)for (auto& e : arr){countMap[e]++;}multimapcout