c++删去vector中的重复元素
时间: 2024-12-09 17:14:16 浏览: 23
C++中vector容器使用详细说明
在 C++ 中,删除 `std::vector` 中的重复元素通常可以使用多种方法,具体取决于数据类型是否支持哈希或者等价比较(例如对于整数、浮点数或自定义类型)。这里给出几种常见的解决方案:
1. **标准库算法** - 如果数据类型支持 `<>` 操作符并且是可哈希的(如整型或字符串),你可以使用 `std::set` 或者 `std::unordered_set` 结合 `std::copy_if` 和 `erase`:
```cpp
std::vector<int> vec = {1, 2, 2, 3, 4, 4, 5};
std::vector<int> unique_vec;
std::copy_if(vec.begin(), vec.end(), std::back_inserter(unique_vec), std::unique_copy);
vec.erase(vec.begin(), vec.end()); // 清空原向量
vec.insert(vec.end(), unique_vec.begin(), unique_vec.end());
```
2. **自定义迭代器** - 对于复杂的数据结构或者不支持哈希的情况,你可以使用 `std::remove_if` 结合自定义函数对重复元素进行判断:
```cpp
bool is_duplicate(const std::pair<int, int>& a, const std::pair<int, int>& b) {
return a.first == b.first && a.second == b.second;
}
auto it = std::remove_if(vec.begin(), vec.end(), is_duplicate);
vec.resize(std::distance(vec.begin(), it));
```
3. **STL容器** - 另一种方式是使用 `std::unique_ptr` 和 `std::remove_copy`,适用于内存管理允许的情况下:
```cpp
std::vector<std::unique_ptr<int>> unique_vec(vec.size());
std::transform(vec.begin(), vec.end(), unique_vec.begin(),
std::mem_fn(&std::unique_ptr<int>::get),
std::stable_partition(vec.begin(), vec.end(), is_duplicate));
vec.clear();
vec.insert(vec.end(), unique_vec.begin(), unique_vec.end());
```
请注意,上述所有示例假设有一个名为 `is_duplicate` 的函数用于判断两个元素是否相等。
阅读全文