2010-11-16 21 views

Respuesta

7

Usted puede mirar en Boost.Assign, lo que le permite escribir cosas como:

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

Sí, puedes! :) (Me ganaste por 5 segundos ...) –

+0

¿Funciona esto con el set? Funciona para diferentes tipos? –

+0

@Amir: Sí, en ambos casos. –

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

Ok, hay dos líneas :)

+0

Niza, '+ 1' de mi parte. Eso es aún más fácil con [estos] (http://stackoverflow.com/questions/2552839/which-c-standard-library-wrapper-functions-do-you-use/2553081#2553081). – sbi

+0

@Sbi, gracias por ese enlace, ¡muy útil! –

+1

Si está disponible, entonces prefiero '... mySet (myints, myints + _countof (myints)) ...' –

3

Aquí hay un C++ 0x alt Según la respuesta de Moo-Juice para el caso donde la construcción de A es más costosa que para 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, eso es bastante limpio. –

+0

@ Moo-Juice - sí, pero inspirado en su versión original. –

4

En C++ 0x La norma define la Initializer List como una mejora de este tipo de constructo (incómodo).

Es mucho más fácil ahora:

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

Todo lo que hizo fue para la biblioteca estándar para declarar el siguiente constructor de juego:

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

y todas nuestras preocupaciones eran perfectamente deslizado.

+0

Tenga en cuenta que hoy en día, con C++ 11, ni siquiera necesita declarar ese constructor. – Claudiu

+0

@Claudiu: No entiendo muy bien a qué te refieres, me temo. –

+0

Quiero decir que puede hacer 'std :: set set = {10, 20, 30, 40, 50};' en su código sin tener que incluir 'template set :: set (std :: initializer_list list); '. [Ejemplo de Ideone aquí] (https://ideone.com/wlWCMl). – Claudiu

4

Si sus datos iniciales están en algún contenedor std::some_container<A> a; que tiene iteradores de inicio y final, y estos son iteradores directos o mejores (solo deberían tener operador ++ sobrecargado) entonces puede hacer un nuevo conjunto de esta manera.

std::set<A> s(a.begin(), a.end()); 
Cuestiones relacionadas