2010-11-16 18 views

risposta

7

È possibile guardare in Boost.Assign, che permette di scrivere cose come:

const std::list<int> primes = boost::assign::list_of(2)(3)(5)(7)(11); 
+1

Sì, è possibile! :) (Mi hai battuto per 5 secondi ...) –

+0

Funziona con il set? Funziona per diversi tipi? –

+0

@Amir: Sì, su entrambi i fronti. –

16
int myints[]= {10,20,30,40,50}; 
std::set<int> mySet(myints, myints + 5); 

Ok, ovviamente due righe :)

+0

Nice, '+ 1' da me. Questo è ancora più facile con [questi] (http://stackoverflow.com/questions/2552839/which-c-standard-library-wrapper-functions-do-you-use/2553081#2553081). – sbi

+0

@Sbi, grazie per il collegamento, molto utile! –

+1

Se è disponibile, allora preferisco '... mySet (myints, myints + _countof (myint)) ...' –

3

Ecco un C++ 0x alt ernativo alla risposta di Moo-Juice per il caso in cui la costruzione di A è più costosa rispetto 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); 
+0

+1, è molto carino. –

+0

@ Moo-Juice - sì, ma ispirato alla tua versione originale. –

4

In C++ 0x standard definisce la Initializer List come un miglioramento per questo tipo di costrutto (scomodo).

E 'molto più semplice:

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

Tutto è bastata per la libreria standard di dichiarare il seguente costruttore per il set:

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

e tutte le nostre preoccupazioni erano ordinatamente strisciato via.

+0

Nota che al giorno d'oggi, con C++ 11, non hai nemmeno bisogno di dichiararlo. – Claudiu

+0

@ Claudiu: Non capisco cosa intendi, temo. –

+0

Voglio dire che puoi semplicemente fare 'std :: set set = {10, 20, 40, 50};' nel tuo codice senza dover includere 'template set :: set (lista std :: initializer_list ); '. [Esempio di Ideone qui] (https://ideone.com/wlWCMl). – Claudiu

4

Se i dati iniziali sono in un contenitore std::some_container<A> a; che ha inizio e fine iteratori e questo è avanti iteratori o migliori (dovrebbero solo essere sovraccaricati con operatore ++), è possibile creare questo nuovo set in questo modo.

std::set<A> s(a.begin(), a.end()); 
Problemi correlati