2012-03-06 87 views
2

是否有一個簡單的方法來檢測集合插入是否發生,因爲插入的項目已經存在於集合中?例如,我想向顯示插入失敗的用戶顯示一條消息,以便他們可以更輕鬆地找到並刪除其數據中的重複項。下面是一些僞代碼來說明我想做什麼:設置檢測插入失敗

try 
{ 
    items.insert(item) 
} 

catch insert_failed_item_already_in_set 
{ 
    // show user the failed item 
} 
+0

http://www.cplusplus.com/reference/stl/set/insert/ – UmNyobe 2012-03-06 15:10:31

+2

出錯了C++標準庫參考?你甚至不會查找你使用的函數的返回類型? – 2012-03-06 15:13:41

+0

對不起。我沒有使用太多套。我很瞭解數據結構,而不是C++如何檢測插入失敗。我不再在這裏問這些問題了。感謝所有花時間回答的人。 – 01100110 2012-03-06 15:41:42

回答

8

有一個在std::set

pair<iterator,bool> insert (const value_type& x);

測試返回對的secondinsert簽名,應設置爲true如果插入成功。

+0

謝謝!我沒有使用太多套。我很欣賞這個參考。這樣可行。 – 01100110 2012-03-06 15:27:53

4

cplusplus

參照插入(常量Ť&值)

第一個版本返回一個對,以其部件對::第一設置爲指向任一新插入的一個迭代元素或者已經在集合中具有相同值的元素。如果插入了新元素,則將pair中的pair :: second元素設置爲true;如果存在相同值的元素,則將該元素設置爲false。

13

一種set::insert簽名是:

pair<iterator,bool> insert (const value_type& x); 

所以,你的代碼看起來像:

if(!items.insert(item).second) 
{ 
    show user the failed item 
} 
+0

糾正; _a_ set :: insert'的簽名 – 2012-03-06 15:14:04

+0

當然你是對的。 – 2012-03-06 15:16:35

0

因爲組容器不允許重複值,插入操作檢查每個元素插入是否另一個元素已經存在於具有相同值的容器中,如果是,則不插入該元素,並且 - 如果該函數返回一個值 - 將返回一個迭代器。

,你可以在這裏找到一個例子: http://www.cplusplus.com/reference/stl/set/insert/

2

STL set<>.insert(elem)回報pair<iterator,bool>其中在對第二個值是true如果元素被成功插入,否則爲false。

0

很容易檢查一個項目是否已經在一個集合中。如果這是你正在尋找的唯一的東西,那就不需要try/catch。

if (items.find(item) == items.end()) 
{ 
    // Item was not in the set, so put it in the set 
    items.insert(item) 
} 
else 
{ 
    // Item was already in the set 
} 

或者,您可以插入的返回值,這是一對在這second半一對是插入是否是成功的:

if (false == items.insert(item).second) 
{ 
    // Item was already in the set 
} 

的兩種方法,第二方法更緊湊,效率更高,因爲第一種方法需要兩次查找,一次是.find,另一次是.insert

4

由於set插入返回對,您可以使用get < 1>來檢查pair的第二個元素的狀態,如果插入完成或不完成,那麼這是布爾值。

if (get<1>(set.insert(x)) == false){ 
//Your error log. 
} 
1

在一組的插入操作返回一對,以其構件first設置爲指向任一新插入的元素或已經在該組中的等效元素的迭代。如果插入了新元素,則該對中的second元素設置爲true;如果已存在等效元素,則將該元素設置爲false。因此,您可以使用second元素來確定它是否已添加。

例如:

#include <iostream> 
#include <set> 
using namespace std; 
int main() 
{ 
std::set<int> myset; 
std::set<int>::iterator it; 
std::pair<std::set<int>::iterator,bool> ret; 


for (int i=1; i<=5; ++i) myset.insert(i*10); // set: 10 20 30 40 50 

ret = myset.insert(20);    // no new element inserted 

if (ret.second==false) 
    cout<<"Element already present"; 

}