亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

求大蝦指點啊是這個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 關注
  • 99 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號