【C++】map和set的使用
前言:前面我们学习了STL中的string、vector、list等等,今天我们就进一步学习更复杂的容器,map和set。
💖 博主CSDN主页:卫卫卫的个人主页 💞
👉 专栏分类:高质量C++学习 👈
💯代码仓库:卫卫周大胖的学习日记💫
💪关注博主和博主一起学习!一起努力!
关联式容器于键值对
什么是关联式容器
C++中的关联式容器是一种可以存储键-值对的容器,它使用键来快速检索值。与序列式容器不同的是,其里面存储的是结构的键值对(不懂的可以去看看上期的博客),在数据检索时比序列式容器效率更高。C++标准库提供了四种关联式容器:std::set、std::multiset、std::map和std::multimap。
-
std::set:std::set是一个基于红黑树实现的有序集合,它存储唯一的元素。元素按照默认的比较函数进行排序,也可以通过自定义比较函数进行排序。
-
std::multiset:std::multiset是一个基于红黑树实现的有序集合,它可以存储重复的元素。元素按照默认的比较函数进行排序,也可以通过自定义比较函数进行排序。
-
std::map:std::map是一个基于红黑树实现的有序关联容器,它存储键-值对,并根据键进行排序。键是唯一的,如果插入重复的键,新的值将覆盖旧的值。
-
std::multimap:std::multimap是一个基于红黑树实现的有序关联容器,它可以存储重复的键-值对。键是可以重复的,插入重复的键-值对会按顺序插入。
关联式容器提供了快速的元素查找操作,时间复杂度为O(log n)。它们还提供了插入和删除元素的操作,并且保持元素的有序性。
键值对
用来表示具有一一对应关系的一种结构,该结构中一般只包含两个成员变量key和value,key代表键值,value表示与key对应的信息。比如:现在要建立一个英汉互译的字典,那该字典中必然有英文单词与其对应的中文含义,而且,英文单词与其中文含义是一一对应的关系,即通过该应该单词,在词典中就可以找到与其对应的中文含义。
键值对- pair
在C++中,键值对可以使用pair模板类来表示,该类定义在头文件中。pair模板类包含两个公共成员变量first和second,分别表示键和值。
下面是一个使用pair的简单示例:
#include #include int main() { std::pair myPair; // 创建一个键值对对象 myPair.first = 1; // 设置键的值 myPair.second = "hello"; // 设置值的值 std::cout typedef T1 first_type; // 第一个元素的类型 typedef T2 second_type; // 第二个元素的类型 T1 first; // 第一个元素 T2 second; // 第二个元素 // 构造函数 pair(); pair(const T1& x, const T2& y); template int a = 1; double b = 3.14; auto myPair = make_pair(a, b); std::cout int id = 1234; string name = "Alice"; return make_pair(id, name);//因此C++无法返回多个参数,通过pair可以解决这一缺陷 } int main() { pair vector cout cout 1, 2, 3, 4, 5}; // 使用 initializer list 初始化 set 对象 set 20, 30, 40 }); // 添加多个元素到 set 中 return 0; } set 20, 30, 40 }); // 添加多个元素到 set 中 int size = mySet.size(); // 获取 set 的元素数量 return 0; } set 20, 0, 40 }); // 添加多个元素到 set 中 int size = mySet.size(); // 获取 set 的元素数量 for (const auto& element : mySet)//按照升序的方式遍历 { cout set 20, 0, 40 }); // 添加多个元素到 set 中 auto it = mySet.find(10); // 查找元素 10 在 set 中的迭代器 if (it != mySet.end()) { // 元素 10 存在于 set 中 cout set 20, 0, 40 }); // 添加多个元素到 set 中 mySet.erase(10); // 从 set 中删除元素 10 mySet.clear(); // 清空 set 中的所有元素 return 0; } multiset10,20,30,40,50,10,20,30};//使用initerator list初始化 return 0; } multiset multiset cout multiset 10,20,30,10,10,50 }; int count = my_set.count(10);//查看10出现的次数 cout multiset 10,20,30,10,10,50 }; auto it = myMultiset.find(20); if (it != myMultiset.end()) { cout cout multiset 10,20,30,10,10,50 }; myMultiset.erase(20);//删除20,删除中序遍历出现的第一个20 return 0; } multiset 10,20,30,10,10,50 }; auto it = myMultiset.begin(); myMultiset.erase(it);//删除迭代器所指向的元素 return 0; } multiset 10,20,30,10,10,50 }; myMultiset.clear();//清空容器中所有的元素 return 0; } multiset 10,20,30,10,10,50 }; int size = myMultiset.size(); cout multiset 10,20,30,10,10,50 }; bool isEmpty = myMultiset.empty();//判断容器是否为空 return 0; } map {"weiwei",90},{"zhou",100}, {"tang", 90}}; return 0; } map "weiwei", 90 }); return 0; } map "zhou", 90 }); cout map "zhou", 90 }); my_map.erase("weiwei"); // 根据键删除对应的键值对 return 0; } map "zhou", 90 }); auto it = my_map.find("weiwei");//查找key值为"weiwei"的迭代器的位置 cout map {"wei",90},{"zhou",100},{"tang",99} }; map cout cout map {"wei",90},{"zhou",100},{"tang",99} }; cout std::map std::multimap std::cout std::cout