Есть ли быстрый способ создать набор? - PullRequest
8 голосов
/ 16 ноября 2010

В настоящее время я создаю новый набор, подобный этому:

    std::set<A> s;
    s.insert(a1);
    s.insert(a2);
    s.insert(a3);
    ...
    s.insert(a10);

Есть ли способ создать s в одну строку?

Ответы [ 6 ]

17 голосов
/ 16 ноября 2010
int myints[]= {10,20,30,40,50};
std::set<int> mySet(myints, myints + 5);

Хорошо, по общему признанию, две строки:)

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

Вы можете просмотреть Boost.Assign , который позволяет писать такие вещи, как:

const std::list<int> primes = boost::assign::list_of(2)(3)(5)(7)(11);
6 голосов
/ 16 ноября 2010

В C ++ 0x стандарт определяет Список инициализаторов как улучшение для этого вида (неудобной) конструкции.

Теперь все намного проще:

std::set<int> set = {10, 20, 30, 40, 50};

Все что потребовалось, чтобы стандартная библиотека объявила следующий конструктор для set:

template <typename Value, typename Compare, typename Allocator>
set<Value, Compare, Allocator>::set(std::initializer_list<Value> list);

, и все наши заботы были аккуратно убраны.

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

Если ваши исходные данные находятся в каком-то контейнере std::some_container<A> a;, который имеет начальный и конечный итераторы, и это прямые и лучшие итераторы (им просто нужно перегружать оператор ++), тогда вы можете создать новый набор таким образом.

std::set<A> s(a.begin(), a.end());
4 голосов
/ 16 ноября 2010

Возможно, вы захотите взглянуть на Boost.Assign:

http://www.boost.org/doc/libs/1_44_0/libs/assign/doc/index.html

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

Вот альтернатива C ++ 0x ответу Moo-Juice для случая, когда построение A дороже, чем для int.

int myints[]= {10,20,30,40,50};
size_t total(sizeof(myints) / sizeof(int));

auto begin(std::make_move_iterator(myints));
auto end(std::make_move_iterator(myints + total));

std::set<int> mySet(begin, end);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...