vector重复玄素
时间: 2025-01-08 09:11:19 浏览: 3
### C++ `vector` 中重复元素的处理
#### 使用 `std::unique` 去重
对于已经排序的 `vector`,可以使用标准库函数 `std::unique` 来移除相邻的重复元素。需要注意的是,此操作不会改变原始容器大小,因此通常需要配合 `erase` 函数来真正删除多余的元素。
```cpp
#include <iostream>
#include <vector>
#include <algorithm>
void remove_duplicates(std::vector<int>& vec) {
auto last = std::unique(vec.begin(), vec.end());
vec.erase(last, vec.end()); // Erase the "unused" elements.
}
int main() {
std::vector<int> v = {1, 2, 2, 3, 3, 3};
sort(v.begin(), v.end()); // Ensure that duplicates are adjacent
remove_duplicates(v);
for (auto elem : v) {
std::cout << elem << ' ';
}
}
```
上述代码展示了如何先对向量进行排序再去除其中连续相同的项[^1]。
#### 利用集合去重
如果不需要保留原有顺序,还可以考虑借助于关联式容器如 `set` 或者 `unordered_set` 实现高效地消除重复项:
```cpp
#include <iostream>
#include <vector>
#include <set>
int main(){
std::vector<int> originalVec = {5, 7, 8, 9, 5, 6};
std::set<int> uniqueSet(originalVec.begin(), originalVec.end());
std::vector<int> noDuplicates(uniqueSet.begin(), uniqueSet.end());
for(int num : noDuplicates){
std::cout<<num<<" ";
}
return 0;
}
```
这段程序通过将数据复制到一个 `set` 容器内完成过滤工作,并最终转换回一个新的无冗余版本的 `vector`[^2]。
#### 统计频率并筛选特定次数出现过的元素
有时可能希望找出那些恰好出现了指定数量次的对象,在这种情况下可采用哈希表记录频数之后遍历统计结果来进行选取:
```cpp
#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;
template<typename T>
vector<T> findElementsWithFrequency(const vector<T>& inputVector, size_t frequency) {
map<T, size_t> freqMap;
for (const auto& item : inputVector) ++freqMap[item];
vector<T> result;
copy_if(inputVector.cbegin(),
inputVector.cend(),
back_inserter(result),
[&freqMap,&frequency](const T& value){return freqMap.at(value)==frequency;} );
return result;
}
// Example usage:
int main(){
vector<int> numbers={1,2,2,3,3,3,4,4,4,4};
vector<int> filtered=findElementsWithFrequency(numbers,3);
for(auto n:filtered)
cout<<n<<' ';
return 0;
}
```
这里定义了一个模板函数用于接收任意类型的序列以及目标出现次数作为参数,返回符合条件的新列表[^3]。
阅读全文