如何使用“唯一”从向量中删除重复项?

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>>

Vuejs - 如何使用 v-for 获取数组中的所有唯一值(删除重复项)

文本到字符串数组并删除重复项

在 Python 中,从列表中删除重复项以使所有元素都是唯一的*同时保留顺序*的最快算法是啥? [复制]