STL——set与unordered_set

set和unorded_set都是只读的,因为是基于排序的容器,直接更改元素会破坏其内部结构。

如果直接存储对象,那么默认都是拷贝语义,STL容器中的数据更改是不会影响到原数据的

set

提供了有序、唯一的容器。

内部实现通常是基于红黑树(自平衡AVL)实现

multiset则可以重复,因为插入时不会监测数据,故可以插入重复数据,而set会检测重复数据,但也会进行排序

插入、删除、操作上都是O(logn)

set常见操作

  • set<T> st; //默认构造

  • set<const set &st>; //拷贝构造

  • set& operator=(const set &st); //重载等号操作符

  • insert(const T& value) //插入元素,若元素已存在,则不会改变set

  • erase(const T& value) //通过指定元素值来删除元素

  • find(const T& value) //查找给定值的元素,返回一个指向该元素的迭代器,若是没找到返回end()

  • size() //返回set元素数量

  • count(key) //返回key的元素个数

  • 遍历可以使用 std::set iterator来遍历,迭代将按元素的排序顺序进行

排序:

默认按照从小到大,

<think>好的,我现在需要详细解答用户关于C++unordered_setunordered_map返回值的问题。首先,我应该回顾这两个容器的基本概念,然后分别讨论它们的返回值类型和相关成员函数的返回值。 首先,unordered_setunordered_map都是C++ STL中的无序关联容器,基于哈希表实现。它们的返回值主要涉及插入、查找、删除等操作的结果。需要区分它们的返回值类型,比如insert返回的是pair<iterator, bool>,而find返回的是迭代器。 接下来,我需要分点讨论unordered_setunordered_map各自的返回值。对于unordered_set,插入操作的返回值是一个pair,其中包含指向插入元素的迭代器和一个布尔值表示是否插入成功。查找操作返回迭代器,删除操作返回删除的元素数量。另外,像count这样的函数返回0或1,因为unordered_set不允许重复元素。 然后是unordered_map的情况。插入操作同样返回pair<iterator, bool>,但插入的元素是键值对。这里需要注意的是,当插入已存在的键时,返回的布尔值为false。查找操作返回指向键值对的迭代器,访问元素时使用operator[]可能会插入新元素,而at()则抛出异常。删除操作的返回值和unordered_set类似。count也是返回0或1,因为键唯一。 还要注意它们之间的区别,比如unordered_map的元素是键值对,而unordered_set是单一值。此外,operator[]在unordered_map中的行为比较特殊,可能会修改容器,这点需要强调。 需要参考用户提供的引用内容,特别是引用[1]、[2]、[4],这些涉及构造、仿函数和迭代器的实现。比如,引用[2]提到unordered_map使用哈希表并通过仿函数获取键值,这可能影响迭代器的返回值类型。引用[4]中的迭代器实现说明了解引用和访问元素的方式,这对理解返回的迭代器如何操作元素有帮助。 最后,生成相关问题时,要考虑用户可能感兴趣的后续内容,比如性能比较、实际应用场景、有序容器的对比等。确保问题覆盖常见疑问,帮助用户深入理解。</think>### C++ unordered_setunordered_map 返回值详解 #### 一、unordered_set 的返回值 1. **插入操作** `insert(value)` 返回一个 `pair<iterator, bool>`: - `first`:指向插入元素的迭代器 - `second`:布尔值,表示是否插入成功(若元素已存在则为 `false`) 示例: ```cpp auto result = s.insert(5); if (result.second) { cout << "插入成功,位置:" << *result.first << endl; } ``` 2. **查找操作** `find(key)` 返回 **迭代器**: - 找到元素时返回指向该元素的迭代器 - 未找到时返回 `end()` 示例: ```cpp auto it = s.find(3); if (it != s.end()) { cout << "找到元素:" << *it << endl; } ``` 3. **删除操作** `erase(key)` 返回删除的元素数量(0 或 1)[^3]。 示例: ```cpp int count = s.erase(4); // 返回1表示删除成功 ``` 4. **其他操作** - `count(key)`:返回 0 或 1(因集合元素唯一) - `empty()`:返回布尔值表示容器是否为空 - `size()`:返回当前元素数量 --- #### 二、unordered_map 的返回值 1. **插入操作** `insert({key, value})` 返回 `pair<iterator, bool>`: - `first`:指向插入键值对的迭代器 - `second`:布尔值,表示是否插入成功(若键已存在则为 `false`)[^2] 示例: ```cpp auto result = m.insert({"apple", 10}); if (result.second) { cout << "插入键值对:" << result.first->first << "->" << result.first->second << endl; } ``` 2. **查找操作** `find(key)` 返回 **迭代器**: - 迭代器指向 `pair<const Key, Value>` 类型 - 未找到时返回 `end()` 示例: ```cpp auto it = m.find("apple"); if (it != m.end()) { cout << "找到值:" << it->second << endl; } ``` 3. **元素访问** - `operator[]`:返回键关联的值的引用(若键不存在则插入默认值) - `at(key)`:返回值的引用,若键不存在则抛出 `out_of_range` 异常 示例: ```cpp m["banana"] = 20; // 插入或修改值 int num = m.at("apple");// 安全访问 ``` 4. **删除操作** `erase(key)` 返回删除的元素数量(0 或 1)[^3]。 --- #### 三、关键区别 | 操作 | unordered_set | unordered_map | |--------------|--------------------------------|------------------------------------| | 插入返回值 | `pair<iterator, bool>` | `pair<iterator, bool>` | | 查找返回值 | 指向元素的迭代器 | 指向键值对的迭代器 | | 元素类型 | 单个值 | 键值对 `pair<const Key, Value>` | | `operator[]` | 不支持 | 支持,可能隐式插入新键 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值