Posso creare un array e inizializzarlo in questo modo:
int a[] = {10, 20, 30};
Come posso creare un std::vector
e inizializzarlo in modo altrettanto elegante?
Il modo migliore che conosco è:
std::vector<int> ints;
ints.push_back(10);
ints.push_back(20);
ints.push_back(30);
C'è un modo migliore?
Se il vostro compilatore supporta C++11, potete semplicemente fare:
std::vector<int> v = {1, 2, 3, 4};
Questo è disponibile in GCC a partire dalla versione 4.4. Sfortunatamente, VC++ 2010 sembra essere in ritardo su questo aspetto.
In alternativa, la libreria Boost.Assign usa una magia non macro per permettere quanto segue:
#include <boost/assign/list_of.hpp>
...
std::vector<int> v = boost::assign::list_of(1)(2)(3)(4);
Oppure:
#include <boost/assign/std/vector.hpp>
using namespace boost::assign;
...
std::vector<int> v;
v += 1, 2, 3, 4;
Ma tenete a mente che questo ha un po' di overhead (fondamentalmente, list_of
costruisce un std::deque
sotto il cappuccio) quindi per il codice critico per le prestazioni fareste meglio a fare come dice Yacoby.
In C++0x sarete in grado di farlo nello stesso modo in cui lo facevate con un array, ma non nello standard attuale.
Con il solo supporto della lingua si può usare:
int tmp[] = { 10, 20, 30 };
std::vector<int> v( tmp, tmp+3 ); // use some utility to avoid hardcoding the size here
Se puoi aggiungere altre librerie potresti provare boost::assignment:
vector<int> v = list_of(10)(20)(30);
Per evitare l'hardcoding della dimensione di un array:
// option 1, typesafe, not a compile time constant
template <typename T, std::size_t N>
inline std::size_t size_of_array( T (&)[N] ) {
return N;
}
// option 2, not typesafe, compile time constant
#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
// option 3, typesafe, compile time constant
template <typename T, std::size_t N>
char (&sizeof_array( T(&)[N] ))[N]; // declared, undefined
#define ARRAY_SIZE(x) sizeof(sizeof_array(x))