vector中去除重复的元素
1. 使用 std::sort
和 std::unique
这种方法首先对 std::vector
进行排序,然后使用 std::unique
函数将相邻的重复元素移到末尾,最后使用 erase
函数删除这些重复元素。
#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> vec = {1, 2, 2, 3, 4, 4, 5};// 排序std::sort(vec.begin(), vec.end());// 使用 std::unique 移动重复元素到末尾auto last = std::unique(vec.begin(), vec.end());// 删除重复元素vec.erase(last, vec.end());//也可以使用一行代码//vec.erase(std::unique(vec.begin(), vec.end()), vec.end());// 输出结果std::cout << "After removing duplicates: ";for (int n : vec) {std::cout << n << " ";}std::cout << std::endl;return 0;
}
2. 使用 std::set
这种方法利用 std::set
的特性,即 std::set
中的元素是唯一的。将 std::vector
中的元素插入到 std::set
中,然后再将 std::set
中的元素复制回 std::vector
。
#include <iostream>
#include <vector>
#include <set>int main() {std::vector<int> vec = {1, 2, 2, 3, 4, 4, 5};// 使用 std::set 去重std::set<int> s(vec.begin(), vec.end());// 将 std::set 中的元素复制回 std::vectorvec.assign(s.begin(), s.end());// 输出结果std::cout << "After removing duplicates: ";for (int n : vec) {std::cout << n << " ";}std::cout << std::endl;return 0;
}
3. 使用 std::unordered_set
这种方法类似于使用 std::set
,但 std::unordered_set
不保证元素的顺序。如果不需要保持元素的顺序,可以使用 std::unordered_set
,它的插入和查找操作通常比 std::set
更快。
#include <iostream>
#include <vector>
#include <unordered_set>int main() {std::vector<int> vec = {1, 2, 2, 3, 4, 4, 5};// 使用 std::unordered_set 去重std::unordered_set<int> s(vec.begin(), vec.end());// 将 std::unordered_set 中的元素复制回 std::vectorvec.assign(s.begin(), s.end());// 输出结果std::cout << "After removing duplicates: ";for (int n : vec) {std::cout << n << " ";}std::cout << std::endl;return 0;
}
总结
- std::sort 和 std::unique:适合需要保持元素顺序的场景。
- std::set:适合需要自动去重和排序的场景。
- std::unordered_set:适合不需要保持元素顺序且需要高效去重的场景。
选择合适的方法取决于具体的需求和使用场景。