我正在尝试使用 C++ 标准库算法 unique (与 BinaryPredicate )。

我创建了一个成对的 vector ;每对就像“(第一个 = 4 个 double 的 vector ,第二个 = 一个整数)”。第二个元素用作索引,因此在使用“unique”后,我仍然可以分辨出原始索引。

在下面的示例中,我创建了如下内容:

10 20 30 40, 1
10 20 30 40, 2
10 20 30 40, 3
10 20 30 40, 4
10 20 30 40, 5
10 20 30 40, 6

现在我想使用 unique 函数来比较每对的第一个元素。我使用了自定义二进制预测器 uniquepred 。确实,它有效,但使用 unique 后 vector 并没有减少。

预期结果
Size before=6
equal!
equal!
equal!
equal!
equal!
Size after=1

实际结果
Size before=6
equal!
equal!
equal!
equal!
equal!
Size after=6

最小工作示例如下。请帮我调试这个。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

typedef std::vector<double> V1db;
typedef std::pair<V1db, int > Pairs;
typedef std::vector<Pairs> Vpairs;

bool uniquepred( const Pairs& l, const Pairs& r) {
    if (l.first==r.first)
        cout<<"equal!"<<endl;
    return l.first == r.first;
}
int main()
{
    Vpairs ak;
    V1db u2(4);
    u2[0]=10;u2[1]=20;u2[2]=30;u2[3]=40;
    Pairs m2;
    m2.first = u2;
    m2.second= 1;
    ak.push_back(m2);
    m2.second= 2;
    ak.push_back(m2);
    m2.second= 3;
    ak.push_back(m2);
    m2.second= 4;
    ak.push_back(m2);
    m2.second= 5;
    ak.push_back(m2);
    m2.second= 6;
    ak.push_back(m2);
    cout<<"Size before="<<ak.size()<<endl;
    unique(ak.begin(), ak.end(), uniquepred);
    cout<<"Size after="<<ak.size()<<endl;

    return 0;
}

最佳答案

你想做:

ak.erase(unique(ak.begin(), ak.end(), uniquepred), ak.end());

原因是 std::unique 对值重新排序。但是它并没有删除它们,你会留下一个新的范围,从 begin()unique 返回的迭代器。除了这种重新排序之外,容器本身不会改变。

vector 上没有“在位置 X 处删除”方法,即使有它也会使迭代器无效。设计的 unique 算法甚至对底层容器一无所知,因此它可以与任何有效的迭代器对一起使用。唯一的要求是它们是 ForwardIterators

关于c++ - stdlib "Unique"方法不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7504030/

10-12 22:04