【发布时间】:2021-04-14 16:28:43
【问题描述】:
我的目标是完全删除 std::vector<std::pair<int, int>> 中多次出现的所有元素。
这个想法是使用std::remove 和std::count 作为谓词的一部分。我的方法看起来像这样:
#include <iostream>
#include <vector>
#include <algorithm>
using std::cout;
using std::endl;
using i_pair = std::pair<int, int>;
int main()
{
std::vector<i_pair> vec;
vec.push_back(i_pair(0,0)); // Expected to stay
vec.push_back(i_pair(0,1)); // Expected to go
vec.push_back(i_pair(1,1)); // Expected to stay
vec.push_back(i_pair(0,1)); // Expected to go
auto predicate = [&](i_pair& p)
{
return std::count(vec.begin(), vec.end(), p) > 1;
};
auto it = std::remove_if(vec.begin(), vec.end(), predicate);
cout << "Reordered vector:" << endl;
for(auto& e : vec)
{
cout << e.first << " " << e.second << endl;;
}
cout << endl;
cout << "Number of elements that would be erased: " << (vec.end() - it) << endl;
return 0;
}
数组被重新排序,将两个(0,1) 元素推到末尾,但是std::remove 返回的迭代器指向最后一个元素。这意味着后续的erase 操作只会删除一个(0,1) 元素。
为什么会出现这种情况?如何删除所有多次出现的元素?
【问题讨论】:
标签: c++ c++11 std stdvector counting