猿问

求大虾指点啊是这个unique函数本身的BUG还是我程序设计哪里出了问题?

各位,今天调试一个程序时发现了一个奇怪的现象(尽量把代码写出来方便大家复制去自己机子上调试):
//首先我建立了一个int型的vector容器并初始化为: 1 1 2 2 3 3 4 4 5 5 
vector<int> v_int;
for(vector<int>::size_type i=1;i<=5;++i)
{
v_int.push_back(i);
v_int.push_back(i);
}
//然后再将容器size扩展为15,并在末尾加入5个值为3的元素
v_int.resize(15,3);
//最后,问题来了:
vector<int>::iterator end_unique;
end_unique = unique(v_int.begin(),v_int.end());//筛选出无重复的序列
v_int.erase(end_unique,v_int.end());//擦除剩余重复元素
for(iter=v_int.begin();iter!=v_int.end();)//输出
{
cout <<*iter++<<" ";
}
输出的序列竟然不是期望的1 2 3 4 5,而是1 2 3 4 5 3!!
也就是说,unique函数没有把重复的那个元素3去除掉
本来正常情况下,如果调用unique后不erase剩下那些重复的元素,序列应该是这样的:
1 2 3 4 5 3 4 4 5 5 3 3 3 3 3 (无重复的序列为1 2 3 4 5)
而unique_end应该指向超出无重复元素范围的下一位置,也就是第六个元素3
但是如果你cout<<*unique_end会惊奇地发现居然是指向4!!
而且更神奇的是,如果在一开始初始化v_int时增多或减少一条v_int.push_back(i)语句,也就是把序列改为
1 2 3 4 5 3 3 3 3 3 或
1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 3 3 3 3 3
那么输出就没有任何问题了,都是1 2 3 4 5(后面不会奇怪地多出个3)
纠结了我一个早上啊TMD,百思不得其解

慕婉清6462132
浏览 71回答 2
2回答

眼眸繁星

函数没有问题,是你的使用方法有问题。end_unique = unique(v_int.begin(),v_int.end());只是删除连续重复的值。记住是连续。你想要的结果12345应该是end_unique = unique(v_int.begin(),v_int.end());&nbsp;end_unique = unique(v_int.begin(),end_unique, mod_equal);&nbsp;先去掉连续重复的,再去掉相等的。

蛊毒传说

1、unique()函数是将重复的元素折叠缩编,使成唯一。2、unqiue_copy()函数是将重复的元素折叠缩编,使成唯一,并复制到他处。这两个函数的剔除字符原理是,看当前字符与他前一个字符是否相同,如果相同就剔除当前字符,如果不同就跳转到下一个字符。所以在求一个字符串的字符集的时候要先把字符串排个序再调用上面两个函数剔除重复字符,获取字符集。3、范例:&nbsp;
随时随地看视频慕课网APP
我要回答