在 C++ 中,set
和 map
是两个常用的容器,它们分别在 <set>
和 <map>
头文件中定义
一、set
set
是一个集合,它可以存储唯一的元素(不重复),且自动排序(默认是升序)
插入、查找和删除的时间复杂度平均为 O(log n)
set<int> mySet;// 插入元素mySet.insert(5);mySet.insert(3);mySet.insert(8);mySet.insert(5); // 重复的元素不会插入// 遍历 setfor (const auto& elem : mySet) {cout << elem << " "; // 输出: 3 5 8(自动升序排列)}cout << std::endl;// 查找元素if (mySet.find(3) != mySet.end()) {cout << "Found 3!" << std::endl;}// 删除元素mySet.erase(3);// 检查删除后的结果if (mySet.find(3) == mySet.end()) {cout << "3 has been removed." << std::endl;}
二、map
map
是一个关联数组,它存储键值对(key-value pairs),
且每个键都是唯一的(不重复),键会自动排序(默认是升序)
查找、插入和删除的时间复杂度平均为 O(log n)
//定义mapmap<int, string> mapStudent;//插入元素mapStudent.insert(pair<int, string>(1, "Da Ming")); //insert插入pair<int,string>,要写类型mapStudent[3] = "Lingling"; //用数组的方式插入mapStudent[2] = "Amy";//map元素不能重复,若已有了该key再插入该key,用insert会插入失败,用"array"会实行覆盖操作//遍历mapfor (const auto& pair : mapStudent) {cout << pair.first << ' ' << pair.second << endl;}//查找元素auto iter = mapStudent.find(1); //查找key值,返回表示对应元素位置的迭代器,找不到则返回.end()if (iter == mapStudent.end()) {cout << "Can not find" << endl;}else {cout << iter->second << endl; //iter->second表示value值}//删除元素mapStudent.erase(1); //用key值查找删除auto it = mapStudent.find(1);mapStudent.erase(it); //用iter删除mapStudent.erase(mapStudent.begin(), mapStudent.end()); //清空整个map
iter迭代器是类似指针,但相比指针有更高级的抽象,所以用iter->second;
pair是对元素的引用,所以用pair.second