vector - 请教:C++的去重unique()为什么反而制造出了重复元素?
本文介绍了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屋!
查看全文