为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C++
慕婉清6462132 2023-03-03 16:12:18
各位,今天调试一个程序时发现了一个奇怪的现象(尽量把代码写出来方便大家复制去自己机子上调试)://首先我建立了一个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,百思不得其解
查看完整描述

2 回答

?
眼眸繁星

TA贡献1873条经验 获得超9个赞

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

查看完整回答
反对 回复 2023-03-06
?
蛊毒传说

TA贡献1895条经验 获得超3个赞

1、unique()函数是将重复的元素折叠缩编,使成唯一。

2、unqiue_copy()函数是将重复的元素折叠缩编,使成唯一,并复制到他处。这
两个函数的剔除字符原理是,看当前字符与他前一个字符是否相同,如果相同就剔除当前字符,如果不同就跳转到下一个字符。所以在求一个字符串的字符集的时候
要先把字符串排个序再调用上面两个函数剔除重复字符,获取字符集。

3、范例:

 


查看完整回答
反对 回复 2023-03-06
  • 2 回答
  • 0 关注
  • 70 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信