2016-12-14 8 views
0

Я хотел бы спросить, есть ли какая-либо точка проверки, существует ли элемент в unorderd_set перед его вставкой? В соответствии с documentation:Проверка наличия элемента в unorderd_set перед его вставкой

Каждый элемент вставляется только если он не является эквивалентом любого другого элемента, уже в контейнере (элементы в unordered_set имеют уникальные значения).

Так что, если я правильно получать его в моем случае:

Element *element = new Element; 
//... 
if (my_set.find (element) == my_set.end()) 
    my_set.insert(element); 

Не требуется - правильно? Что на самом деле происходит, если я пытаюсь вставить элемент, который уже находится в наборе. Выполняет ли он точно такую ​​же проверку, что и я?

+1

Прочитайте документацию, Лука: http://en.cppreference.com/w/cpp/container/unordered_set/insert –

+2

Кроме того, сделайте себе одолжение и не совершайте торговлю в Raw Pointers. –

ответ

2

Если вы попытаетесь вставить значение, которое уже присутствует, набор останется неизменным. Вызов возвращает пару, содержащую итератор и логическое значение. Булев будет false, если элемент уже присутствует.

http://en.cppreference.com/w/cpp/container/unordered_set/insert

Обратите внимание, что в вашем случае, когда набор содержит указатели это будет только предотвратить вас от дублирующих указателей, а не дублировать содержание. Например,

Если ваш объект Element представляет собой элемент, например, Oxygen, он может содержать значение для атомного номера и строку для имени. Если вы хотите, чтобы кислород отображался только один раз, набор указателей не будет автоматически делать это.

+1

Я не получаю то, что вы хотите сказать своим последним предложением ... Если вам нужно равные указатели (один и тот же адрес) одного типа: какой контент можно дублировать в своем оппоненте? –

+0

@SimonKraemer Если есть некоторые аспекты объектов Element, которые он пытается сохранить уникальными, использование набора указателей этого не сделает. –

+0

Теперь это более ясно. +1 для обновленного ответа. –

0

insert()unorderd_set делает a find(), чтобы узнать, существует ли объект и затем вставляет его.

Так что в вашем коде они два find(), один явный, а другой внутри insert()