C++中set,map使用自定义类型

本文介绍在C++中如何正确使用set容器处理自定义数据类型,包括重载小于运算符来确保元素间的正确排序。

首先声明自己C++比较菜,所以以下写的都是大神不太可能出的问题。

在项目中需要用到C++的set,并且是自定义类型作为泛型参数,刚开始的时候

比较随意,就随便用了,但是在编译的时候一直报很奇怪的错误


最后一行有乱码的地方,大概是说没有相匹配的 < 。查了和set相关的资料后才明白,C++中

set和map是红黑树实现的,所以如果使用自定义的类型的时候,需要在自己的类型中重载<号

重载函数大致如下:


先记录下来,以免以后再犯同样的错误。

### C++ 中 `set` 和 `map` 的常用函数及用法 #### 一、`set` 基本介绍及其常见函数 `set` 是 C++ STL 提供的一种有序集合容器,其内部实现通常基于红黑树结构。它具有自动去重的功能,并保持元素的唯一性和顺序性。 以下是 `set` 的一些常用函数: - **插入元素**: 使用 `insert()` 函数可以向 `set` 容器中添加新元素[^4]。 ```cpp std::set<int> s; s.insert(10); ``` - **删除元素**: 可通过指定键值的方式调用 `erase()` 删除特定元素;也可以传入迭代器指向的位置进行删除[^5]。 ```cpp s.erase(10); // 删除值为10的元素 auto it = s.find(20); if(it != s.end()) { s.erase(it); // 利用迭代器删除 } ``` - **查元素**: 调用 `find()` 方法返回目标位置的迭代器,如果不到则返回 `end()` 迭代器[^6]。 ```cpp auto result = s.find(15); if(result != s.end()){ cout << *result << endl; // 输出到的结果 } ``` - **获取大小**: 使用 `size()` 获取当前存储项的数量[^7]。 ```cpp size_t setSize = s.size(); ``` - **清空集合**: 执行 `clear()` 将移除所有数据[^8]。 ```cpp s.clear(); // 清空整个set ``` #### 二、`map` 基本介绍及其常见函数 `map` 同样属于关联型容器之一,用于保存键值对(key-value pairs),其中key部分不允许重复且按一定次序排列,默认升序。 下面列举几个重要的成员方法: - **访问映射中的值**: 方括号运算符 `operator[]` 或者 `at()` 都能完成此功能[^9][^2]。 ```cpp std::map<std::string, int> ageMap; ageMap["Tom"] = 22; // 插入或更新操作 int tomAge = ageMap.at("Tom"); // 如果不存在会抛异常std::out_of_range ``` - **插入/修改条目**: 类似于上述例子直接赋值即可新增或者覆盖已有记录[^10]。 - **擦除节点**: 支持三种形式参数传递给 `erase()`: 单独某个关键字、区间范围以及具体定位地址(iterators)[^11]. ```cpp ageMap.erase("Jerry"); ageMap.erase(ageMap.begin(), ageMap.upper_bound("Sam")); ``` - **统计数量**: 对应某Key是否存在可通过 `count()` 来判断,因为Keys不可重复所以要么等于零要么就是壹[^12]。 ```cpp bool hasAlice = ageMap.count("Alice") > 0 ? true : false ; ``` - **边界查询**: 提供了诸如 `lower_bound`, `upper_bound` 等辅助工具帮助快速锁定符合条件的部分区域[^13]。 ```cpp auto lowerIt = ageMap.lower_bound("Bob"); auto upperIt = ageMap.upper_bound("Charlie"); ``` 另外还支持自定义比较规则创建实例化对象时设定第三模板形参作为Comparator类型[^14]. 最后附上一段综合演示代码片段: ```cpp #include <iostream> #include <set> #include <map> using namespace std; int main(){ set<int> mySet{4,7,2}; map<string,double> scores{{"John",85},{"Mary",92}}; // Set Operations mySet.insert(10); for(auto num:mySet){ cout<<num<<" "; } // Map Operations scores["Peter"]=78; double peterScore=scores.at("Peter"); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值