std::set 删除
时间: 2023-11-08 13:06:38 浏览: 70
std::set删除元素可以使用erase()函数。在引用中提供了一个删除元素的示例代码。该代码使用迭代器iter遍历set,如果当前元素小于等于2,则使用vec.erase(iter)删除元素,并且迭代器自动指向下一个元素。如果当前元素大于2,则迭代器自增。通过这种方式可以删除set中的元素。
另外,在引用中也提供了另一种删除元素的方法。该方法也是使用迭代器iter来遍历set,如果当前元素小于等于3,则使用iter = vec.erase(iter)删除元素,并且将迭代器指向下一个元素。如果当前元素大于3,则迭代器自增。
需要注意的是,删除元素后,set的大小会相应减小。
相关问题
std::set 与 std::unordered_set的区别
`std::set` 和 `std::unordered_set` 都是 C++ 标准库中的容器,用于存储唯一的元素,但它们内部的实现和性能特征有所不同:
1. **排序**:
- `std::set` 是一个有序集合,它的元素按照一定的顺序(默认是字典序)进行排列。插入、删除和查找操作的时间复杂度都是 O(log n),其中 n 是集合的大小。排序保证了元素的自然顺序或自定义比较函数的结果。
2. **哈希**:
- `std::unordered_set` 则是一个无序集合,它使用哈希表(Hash Table)作为底层数据结构,这意味着元素的插入、删除和查找操作通常具有接近常数时间的平均复杂度,即 O(1)。然而,最坏情况下的时间复杂度为 O(n),当哈希冲突频繁发生时。
3. **空间效率**:
- `std::unordered_set` 由于不维护元素的顺序,所以在空间效率上通常优于 `std::set`,特别是对于大型数据集。
4. **随机访问**:
- `std::set` 支持迭代器提供的随机访问功能,可以根据索引直接访问元素。
- `std::unordered_set` 不支持随机访问,因为元素的位置取决于哈希值,无法直接通过索引来获取。
5. **碰撞处理**:
- `std::set` 无需处理哈希冲突,因为它是基于排序的。
- `std::unordered_set` 需要处理哈希冲突,使用链表或开放寻址法等方法来解决。
std::unordered_set<std::string>
`std::unordered_set<std::string>`是C++标准库中的一个容器,它属于关联容器(Associative Container)的一部分,用于存储唯一(uniquely)的`std::string`类型的元素。unordered_set的特点是使用哈希表(Hash Table)作为底层数据结构,这使得查找、插入和删除操作的时间复杂度通常为O(1),即使在大型数据集中也能保持高效性能。
以下是unordered_set的一些关键特性:
1. 唯一键:每个元素的值会被哈希并用作键,确保不会有重复的键(即没有两个相同的`std::string`值)。
2. 遍历:虽然查找快,但遍历顺序不是固定的,因为哈希表的内部结构不保证按照插入顺序排序。
3. 自动去重:当你试图插入已经存在的元素时,unordered_set不会做任何操作,因为它保证了元素的唯一性。
4. 内部管理:无需关心内存分配和释放,unordered_set会自动处理这些细节。
如果你正在使用unordered_set,可能会遇到以下情况:
- 插入和查找操作:使用`insert()`和`find()`方法。
- 删除元素:可以使用`erase()`方法删除指定的元素或范围。
- 集合大小:通过`size()`获取集合中元素的数量。
阅读全文