std::set 去重
时间: 2023-10-23 15:10:01 浏览: 233
你可以使用标准库中的 `std::set` 容器来实现去重功能。`std::set` 是一个有序容器,它会自动保持元素的唯一性,即不允许重复的元素存在。
你可以将需要去重的元素逐个插入到 `std::set` 中,它会自动去除重复元素。以下是一个简单的示例:
```cpp
#include <iostream>
#include <set>
int main() {
std::set<int> mySet;
// 插入元素
mySet.insert(10);
mySet.insert(20);
mySet.insert(30);
mySet.insert(20); // 重复元素,不会被插入
// 遍历输出
for (const auto& element : mySet) {
std::cout << element << " "; }
return 0;
}
```
输出结果为:`10 20 30`,可以看到重复的元素并没有被插入到 `std::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()`获取集合中元素的数量。
std::set 自定义类去重
要在 std::set 中使用自定义类进行去重,你需要重载该类的比较运算符。默认情况下,std::set 使用 std::less 运算符来比较元素,但你可以自定义比较函数。
首先,确保你的自定义类重载了 < 运算符。然后,你可以为 std::set 提供一个自定义的比较函数,例如:
```cpp
struct MyClass {
int value;
bool operator<(const MyClass& other) const {
return value < other.value;
}
};
// 自定义比较函数
struct Compare {
bool operator()(const MyClass& a, const MyClass& b) const {
return a.value < b.value;
}
};
int main() {
std::set<MyClass, Compare> mySet;
MyClass obj1{5};
MyClass obj2{2};
MyClass obj3{7};
mySet.insert(obj1);
mySet.insert(obj2);
mySet.insert(obj3);
for (const auto& obj : mySet) {
// 输出:2 5 7
std::cout << obj.value << " ";
}
return 0;
}
```
在上面的示例中,我们创建了一个 MyClass 类,并重载了 < 运算符。然后,我们定义了一个名为 Compare 的比较函数对象,该函数对象在 std::set 中用于比较 MyClass 对象。最后,我们创建了一个 std::set 实例,并将自定义类的对象插入其中。循环遍历 std::set 输出结果时,元素将按照自定义比较函数的规则排序并去重。
阅读全文