vector去掉重复项
时间: 2023-06-13 15:02:15 浏览: 84
可以使用STL中的`std::unique`函数来去除vector中的重复项。这个函数会将所有相邻的重复元素都移到vector的尾部,然后返回一个迭代器,指向vector中不重复的部分的结尾。最后再使用`std::vector::erase`函数将重复元素删除即可。
示例代码如下:
```c++
#include <vector>
#include <algorithm>
int main() {
std::vector<int> vec = {1, 2, 3, 2, 4, 3, 5, 6, 6};
std::sort(vec.begin(), vec.end()); // 先对vector进行排序
auto end = std::unique(vec.begin(), vec.end()); // 去重
vec.erase(end, vec.end()); // 删除重复元素
return 0;
}
```
执行完这段代码后,`vec`中将只剩下不重复的元素:`{1, 2, 3, 4, 5, 6}`。
相关问题
vector去除重复元素个数
在C++中,如果你有一个`std::vector`容器并想要计算其中重复元素的数量,可以采用多种方法。一种常见的方式是利用`std::unordered_set`,因为它不允许有重复元素,所以你可以先将`vector`转换成`unordered_set`,然后比较两个集合的大小差异:
```cpp
#include <vector>
#include <unordered_set>
size_t count_duplicates(const std::vector<int>& vec) {
std::unordered_set<int> unique_elements(vec.begin(), vec.end());
return vec.size() - unique_elements.size();
}
```
这个函数会返回`vec`中独特元素的数量,重复的元素已经从计数中减去。
如果你想直接在原地操作并保留`vector`,可以使用`std::unique`算法配合`std::remove_if`:
```cpp
size_t count_duplicates(const std::vector<int>& vec) {
vec.erase(std::unique(vec.begin(), vec.end()), vec.end());
return vec.size();
}
```
这将删除连续的重复项,并返回新的元素数量,即非重复元素的数量。
c++ 递归去除vector 中重复自定义结构体
在C++中,如果你有一个自定义结构体并且想要从`std::vector`中移除所有重复项,可以使用递归来遍历并检查每个元素是否已经存在于集合中。这里是一个简单的例子,假设你的结构体名为`MyStruct`:
```cpp
#include <iostream>
#include <vector>
#include <unordered_set>
// 自定义结构体 MyStruct
struct MyStruct {
// 假设这里有两个字段用于唯一标识
int field1;
std::string field2;
bool operator==(const MyStruct& other) const {
return field1 == other.field1 && field2 == other.field2;
}
};
// 使用一个无序集合(Set)来存储已见的元素
std::unordered_set<MyStruct> seenElements;
// 递归函数,接收vector和索引作为参数
void removeDuplicates(std::vector<MyStruct>& vec, size_t index = 0) {
if (index >= vec.size()) {
// 如果已到达末尾,结束递归
return;
}
// 检查当前元素是否已经在集合中
if (seenElements.find(vec[index]) != seenElements.end()) {
// 如果存在,则删除并继续处理下一个
vec.erase(vec.begin() + index);
return removeDuplicates(vec, index); // 递归调用,跳过已删除的位置
} else {
// 如果不存在,添加到集合中然后进入下一层迭代
seenElements.insert(vec[index]);
return removeDuplicates(vec, index + 1);
}
}
int main() {
std::vector<MyStruct> myVector = { /* ... */ }; // 填充你的向量
removeDuplicates(myVector);
// 输出处理后的vector
for (const auto& item : myVector) {
std::cout << "Item: {" << item.field1 << ", " << item.field2 << "}\n";
}
return 0;
}
```
在这个示例中,`removeDuplicates` 函数会通过递归地比较每个元素和之前见过的元素来移除重复。如果遇到重复,就从向量中删除该元素,并调整递归调用的索引来忽略已删除的元素。
阅读全文