如何使用“唯一”从向量中删除重复项?
Posted
技术标签:
【中文标题】如何使用“唯一”从向量中删除重复项?【英文标题】:How to remove duplicates from vector using "unique"? 【发布时间】:2013-11-16 09:36:04 【问题描述】:我正在尝试使用“唯一”从向量中删除重复项,但它似乎不起作用。 这是我第一次使用迭代器。请告知我在哪里做错了。 提前致谢!
编辑: 对 p2dvector 进行排序,使用 unique 和 erase 来查找和删除重复项。但不会删除重复项。
输出:
X:3 和 Y:2 仍然重复。
x: 3
y: 2
x: 6
y: 4
x: 3
y: 2
vector<Point2D> p2dvector;
//vector<Point2D> :: iterator it, it_end;
void readData()
cout<< "Please enter filename : ";
cin >> inputFile;
fstream fileStream;
fileStream.open(inputFile.c_str(),fstream::in);
int records = 0;
while( fileStream.good() )
string line = "";
while (getline (fileStream, line))
stringstream ss (line);
getline (ss, className, ',');
if (className == "Point2D")
int x, y;
getline (ss, p2dX, '[');
getline (ss, p2dX, ',');
getline (ss, p2dY, ' ');
getline (ss, p2dY, ']');
istringstream (p2dX) >> x;
istringstream (p2dY) >> y;
Point2D p2d (x, y);
p2dvector.push_back(p2d);
//amended to this
sort(p2dvector.begin(), p2dvector.end());
p2dvector.erase(unique(p2dvector.begin(), p2dvector.end()), p2dvector.end());
/*
for (it = p2dvector.begin(); it < p2dvector.end(); it++)
cout << "before : " << *it;
it_end = unique(p2dvector.begin(), p2dvector.end());
for (it = p2dvector.begin(); it < it_end; it++)
cout << "removed duplicates : " << *it; */
错误:(编辑:使用排序、唯一性和擦除后此错误已解决,但重复数据不会被删除)
In file included from /usr/include/c++/4.6/algorithm:63:0,
from Assn3.cpp:7:
/usr/include/c++/4.6/bits/stl_algo.h: In function ‘_FIter std::unique(_FIter, _FIter) [with _FIter = __gnu_cxx::__normal_iterator<Point2D*, std::vector<Point2D> >]’:
Assn3.cpp:149:55: instantiated from here
/usr/include/c++/4.6/bits/stl_algo.h:1189:2: error: no match for ‘operator==’ in ‘__dest.__gnu_cxx::__normal_iterator<_Iterator, _Container>::operator* [with _Iterator = Point2D*, _Container = std::vector<Point2D>, __gnu_cxx::__normal_iterator<_Iterator, _Container>::reference = Point2D&]() == __first.__gnu_cxx::__normal_iterator<_Iterator, _Container>::operator* [with _Iterator = Point2D*, _Container = std::vector<Point2D>, __gnu_cxx::__normal_iterator<_Iterator, _Container>::reference = Point2D&]()’
【问题讨论】:
【参考方案1】:std::unique
默认调用operator==
来比较元素。你需要为Point2D
定义它
bool operator==(const Point2D& lhs, const Point2D& rhs);
std::unique
删除相邻的重复项,如果您要删除所有重复项,则需要对p2dvector
进行排序。
【讨论】:
+1 或定义一个自定义相等比较器作为可选的第三个参数传递给std::unique
@billz 修改了我上面的代码。我正在使用排序、唯一和擦除,但不会删除重复值。以上是关于如何使用“唯一”从向量中删除重复项?的主要内容,如果未能解决你的问题,请参考以下文章
R语言unique函数计算数据对象(vectordataframe)的unique独特值:unique函数从vector向量dataframe中删除重复项删除dataframe重复行
排序和删除向量中的重复项<vectors< double>>