std :: set и его front_insert_iterator - PullRequest
       3

std :: set и его front_insert_iterator

1 голос
/ 16 ноября 2010

Я знаю, что могу сделать это:

std::vector<double> vec;
std::back_insert_iterator<std::vector<double> > it( back_inserter(vec) );
it = 4.5;

Но я бы хотел сделать что-то похожее (в синтаксис ) на std::set (и использовать front_insert_iterator вместо ссылки на набор и использовать set::insert). Возможно ли это, или я вынужден использовать ссылку на набор? Может быть, я должен использовать std::merge и / или std::set_intersect (это позволило бы получать хорошие сообщения об ошибках в случае дубликатов)? Это был бы хороший подход?

Спасибо!

Ответы [ 3 ]

3 голосов
/ 16 ноября 2010

Вы не push_back или push_front до set, потому что (концептуально) set является отсортированным ассоциативным контейнером. Вы можете сделать это, хотя:

#include <cstdlib>
#include <set>
#include <iterator>
using namespace std;

int main()
{
    typedef set<int> MySet;
    MySet si;
    insert_iterator<MySet> it(si, si.begin());

    *it = 1;
    *it = 2;

}

EDIT:

Обратите внимание, что begin(), с которым инициализируется итератор, это , а не , куда помещаются элементы. Скорее, это подсказка STL, где начать искать, куда поместить предмет.

EDIT2:

Согласно комментариям ниже, вы также хотели проверить «расположение» вставленного предмета. То есть способ узнать, присутствовал или не присутствовал элемент до того, как вы его вставили.

Вы не можете сделать это напрямую, используя only итератор. Если вам нужна эта информация, у вас есть два варианта.

1) Не используйте итератор вставки. Единственный способ получить bool, полученный от set::insert, - позвонить set::insert. Так что звоните set::insert

42) Проверьте размер set как до, так и после вставки. Если размер вырос на единицу, элемент был вставлен. :) Я рекламирую это как пункт № 42, потому что IMO это гораздо менее выгодно, чем просто звонить insert напрямую по ряду причин. Могут быть проблемы с многопоточностью, может быть снижение производительности при вычислениях size() и т. Д.

1 голос
/ 16 ноября 2010

Для использования front_insert_iterator в контейнере должен быть определен элемент push_front (например, стандартные контейнеры deque и list).

1 голос
/ 16 ноября 2010

Вы не можете вставить в "заднюю" или "переднюю часть" set. Возможно, то, что вы ищете, это std::inserter.

http://stdcxx.apache.org/doc/stdlibref/insert-iterator.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...