Jeg kan opprette en matrise og initialisere den slik:
int a[] = {10, 20, 30};
Hvordan oppretter jeg en std::vector
og initialiserer den på samme elegante måte?
Den beste måten jeg vet er:
std::vector<int> ints;
ints.push_back(10);
ints.push_back(20);
ints.push_back(30);
Finnes det en bedre måte?
Hvis kompilatoren din støtter C++11, kan du ganske enkelt gjøre det:
std::vector<int> v = {1, 2, 3, 4};
Dette er tilgjengelig i GCC fra og med versjon 4.4. Dessverre ser det ut til at VC++ 2010 henger etter på dette området.
Alternativt bruker biblioteket Boost.Assign ikke-makro-magi for å gjøre følgende:
#include <boost/assign/list_of.hpp>
...
std::vector<int> v = boost::assign::list_of(1)(2)(3)(4);
Eller:
#include <boost/assign/std/vector.hpp>
using namespace boost::assign;
...
std::vector<int> v;
v += 1, 2, 3, 4;
Men husk at dette har noe overhead (i utgangspunktet konstruerer list_of
en std::deque
under panseret), så for ytelseskritisk kode er det bedre å gjøre som Yacoby sier.
I C++0x vil du kunne gjøre det på samme måte som med en array, men ikke i den nåværende standarden.
Med bare språkstøtte kan du bruke:
int tmp[] = { 10, 20, 30 };
std::vector<int> v( tmp, tmp+3 ); // use some utility to avoid hardcoding the size here
Hvis du kan legge til andre biblioteker, kan du prøve boost::assignment:
vector<int> v = list_of(10)(20)(30);
For å unngå hardkoding av størrelsen på en matrise:
// 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))