【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 
