vector - 请教:C++的去重unique()为什么反而制造出了重复元素?

查看:456
本文介绍了vector - 请教:C++的去重unique()为什么反而制造出了重复元素?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

现在有一个vector是 {1, 2, 2, 2, 3, 3, 2, 2, 1, 99}; 只有一个元素是99。然而我用去重unique()函数竟然制造出了重复元素2个99?……

void vector_display(vector<int> &vect)
    {
    vector<int>::iterator iter;
    for (iter=vect.begin(); iter!=vect.end(); iter++) printf("%d ", (*iter));
    cout << endl;
    }

int main()
    {
    vector<int> vector_unique = {1, 2, 2, 2, 3, 3, 2, 2, 1, 99};
    vector_display(vector_unique);
    vector<int>::iterator iter_unique;
    iter_unique = unique(vector_unique.begin(), vector_unique.end());
    vector_display(vector_unique);
    return 0;
    }

原始的vector是 {1, 2, 2, 2, 3, 3, 2, 2, 1, 99};
去重的vector是 {1, 2, 3, 2, 1, 99| 2, 2, 1, 99}; 竟然有2个99?

成员函数unique()实质上是伪去重,只能让相邻元素不相同,然后把重复的元素添加到容器末尾。前6个元素{1, 2, 3, 2, 1, 99|}很好理解,但是为什么末尾会有2个99?另外,原始vector中重复的元素3为什么没有被放置到vector末尾呢?

谢谢了先!

解决方案

题主好像写错了去重的vector的内容。我跑了下这段代码,结果是:

1 2 2 2 3 3 2 2 1 99 
1 2 3 2 1 99 2 2 1 99 

这个没毛病。根据 http://www.cplusplus.com/refe... 上的描述,unique的用途是把相邻的元素去重,但是并没有题主所说的然后把重复的元素添加到容器末尾。

实质上,unique的算法应该是这样的:(伪代码)

I := begin
J := begin

for (I++; I != end; I++) {
    if (*I != *J){
       *J = *I
       *J++
    }
}

return J + 1

即,unique只是遍历了整个容器(数组/向量),然后把连续的重复元素向左合并成一个元素。并没有把重复的元素添加到容器末尾的功能。

可以试试下面这组数据:

{1, 2, 2, 2, 3, 3, 2, 2, 1, 88, 77, 55, 44, 99}

结果是:

1 2 2 2 3 3 2 2 1 88 77 55 44 99 
1 2 3 2 1 88 77 55 44 99 77 55 44 99 

顺便说下:使用unique前一般都要先排序的。

这篇关于vector - 请教:C++的去重unique()为什么反而制造出了重复元素?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆