一、使用set去重
使用set去重是一种非常方便的方法。因为set容器中不允许有重复元素存在,因此我们可以将vector中的元素放到set中,再将set中的元素重新放回vector中,实现去重效果。
#include#include #include using namespace std; int main(){ vector vec{1,2,2,3,3,3,4,5}; set s(vec.begin(), vec.end()); vec.assign(s.begin(), s.end()); for(int i=0; i 使用set去重方法简单易懂,但是需要注意的是,set中的元素是自动按升序排序的。如果需要按照一定规则排序,需要重载比较运算符。
二、使用unique去重
unique函数可以消除相邻重复元素,但是它不能处理vector容器中所有重复的元素,需要结合erase函数才能去重。
#include#include #include using namespace std; int main(){ vector vec{1,2,2,3,3,3,4,5}; auto end_unique = unique(vec.begin(), vec.end()); vec.erase(end_unique, vec.end()); for(int i=0; i 使用unique去重需要注意的是,输入的vector中的元素必须是已经排过序的,否则结果不准确。
三、使用自定义函数实现去重
使用自定义函数实现去重是一种非常灵活的方法。这个方法的本质是通过循环遍历vector容器,将其中重复的元素进行删除。
#include#include using namespace std; void removeDuplicate(vector & vec){ for(int i=0; i vec{1,2,2,3,3,3,4,5}; removeDuplicate(vec); for(int i=0; i 使用自定义函数实现去重能够灵活地处理各种需求,但是时间复杂度比较高,需要用两个循环遍历vector容器。
四、使用双指针方法实现去重
双指针方法是一种高效的去重方法,它将vector容器看做一个已经排好序的数组,使用两个指针维护vector容器中唯一元素的个数。这个方法的时间复杂度为O(n),由于是双指针操作,因此空间复杂度比较低。
#include#include using namespace std; void removeDuplicate(vector & vec){ if(vec.empty()) return; int slow=0, fast=1; while(fast < vec.size()){ if(vec[fast] != vec[slow]){ vec[++slow] = vec[fast]; } fast++; } vec.resize(slow+1); } int main(){ vector vec{1,2,2,3,3,3,4,5}; removeDuplicate(vec); for(int i=0; i 使用双指针方法实现去重是一种高效的方法,但是需要注意的是,这个方法只能适用于已经排好序的vector容器。
五、使用unordered_map实现去重
使用unordered_map可以实现在O(n)的时间复杂度下实现vector容器的去重效果。这个方法通过unordered_map容器自动排除重复元素的思想来实现。
#include#include #include using namespace std; void removeDuplicate(vector & vec){ unordered_map unmap; for(auto it=vec.begin(); it != vec.end(); ){ if(unmap[*it] == true){ it = vec.erase(it); }else{ unmap[*it] = true; ++it; } } } int main(){ vector vec{1,2,2,3,3,3,4,5}; removeDuplicate(vec); for(int i=0; i 使用unordered_map方法能快速地实现vector容器的去重,使用起来也比较方便。但是unordered_map容器提高了空间复杂度,需要根据实际情况选择使用。