2013-10-24 149 views
0

我注意到std :: unique的行爲並不像它應該的樣子,當我有一個大小約爲2000的向量時。我嘗試使用一個更小的向量來實現唯一性,並且按照預期執行。我通過在兩個向量中添加大約30個重複條目來測試這一點。如預期的那樣,在較小的向量中,獨特地將這些額外的29個條目放在向量的末尾。但是,在較大的向量中,重複條目中只有一個條目存在。我有可能超出限制嗎?大小矢量都使用相同的代碼。std :: unique是否有大小限制?

sort(dbaselista.begin(),dbaselista.end()); 
vector<string>::iterator lasta = unique(dbaselista.begin(),dbaselista.end()); 
//dbaselista.erase(lasta, dbaselista.end()); 

作爲一個簡單的例子,

小載體:19AB 175D 12AC 19F7 19F7 19F7 19F7 209C 20AF

結果:12AC 175D 19AB 19F7 209C 20AF 19F7 19F7 19F7

如果我跑具有更大矢量的相同代碼19F7將只存在一次。

+1

發佈您的代碼,杜拜。 – catscradle

+0

最好用實際的代碼來演示問題。 – BartoszKP

回答

6

std::unique()承諾要做的唯一事情是返回已刪除重複項的範圍。函數運行後,它返回的新結束迭代器之外的項目不需要任何東西,因此它們可以是任何東西。

+0

好的,看起來像更大的矢量正在發生的事情,它似乎仍然有效。然而,只是好奇,爲什麼它沒有遵循相同的約定,就像在更小的向量中填充新的結束迭代器之外的項目一樣?此外,小矢量功能的好處是我可以識別哪些條目是重複的。 –

+0

@MarkHsiung:我不知道爲什麼它在兩個輸入上表現不同,但我知道標準爲什麼沒有保證它會如何表現這些過去的新端元素的更高級的原因:它是因此一些未知的未來優化將使函數在'[start,new_end)'範圍內的行爲保持不變,但恰好導致對該範圍的其餘部分進行不同處理,仍然可以實現(從而加速所有程序在不違反標準的情況下調用'unique()'。 –

+0

@MarkHsiung:一個好的庫可能會考慮諸如高速緩存行大小之類的事情。在單個高速緩存行中移動元素實際上是免費的,將它們移動到另一個高速緩存行非常昂貴。 – MSalters

相關問題