2012-03-06 4 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

+2

Что-то не так с вашей C++ стандартной библиотеки справки? Вы даже не смотрите на возвращаемый тип функций, которые вы используете? –

+0

Извините за вопрос. Я много не использовал множество. Я хорошо знаю структуру данных, а не как C++ обнаружил сбой вставки. Я больше не буду задавать эти вопросы. Спасибо всем, кто нашел время ответить. – 01100110

ответ

8

Существует эта insert подпись в std::set

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

Протестируйте second возвращаемой пары, должен быть установлен верно если вставлено успешно.

+0

Спасибо! Я много не использовал множество. Я ценю ссылку. Это работает. – 01100110

4

от cplusplus:

со ссылкой для вставки (Const Т & значение)

Первая версия возвращает пару, с его парой членов :: первый набор для итератора, указывающий либо вновь вставляется элемент или элемент, который уже имеет такое же значение в наборе. Пара :: второй элемент в паре имеет значение 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' –

+0

Вы правы, конечно. –

0

Поскольку набор контейнеров не позволяют дублирующие значения, операция вставки проверки для каждого элемент вставлен, существует ли еще один элемент в контейнере с тем же значением, если это так, элемент не вставлен и - если функция возвращает значение - возвращается итератор к нему.

вы можете найти пример здесь: http://www.cplusplus.com/reference/stl/set/insert/

2

STL set<>.insert(elem) возвращает pair<iterator,bool>, где второе значение в паре true, если элемент был успешно вставлен, ложь в противном случае.

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

В качестве установочной пары возврата вы можете проверить состояние второго элемента пары, используя get < 1> который является логическим, если ваша вставка выполнена или нет.

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"; 

} 
Смежные вопросы