Ποιος είναι ο ευκολότερος τρόπος για να αρχικοποιήσετε ένα std::vector με σκληρά κωδικοποιημένα στοιχεία;

Μπορώ να δημιουργήσω έναν πίνακα και να τον αρχικοποιήσω ως εξής:

int a[] = {10, 20, 30};

Πώς μπορώ να δημιουργήσω ένα std::vector και να το αρχικοποιήσω παρόμοια κομψά;

Ο καλύτερος τρόπος που γνωρίζω είναι:

std::vector<int> ints;

ints.push_back(10);
ints.push_back(20);
ints.push_back(30);

Υπάρχει καλύτερος τρόπος;

Αν ο μεταγλωττιστής σας υποστηρίζει την C++11, μπορείτε απλά να κάνετε:

std::vector v = {1, 2, 3, 4};

Αυτό είναι διαθέσιμο στο GCC από την έκδοση 4.4. Δυστυχώς, το VC++ 2010 φαίνεται να υστερεί σε αυτό το θέμα.

Εναλλακτικά, η βιβλιοθήκη Boost.Assign χρησιμοποιεί μη μακροσκοπική μαγεία για να επιτρέψει τα εξής:

#include 
...
std::vector v = boost::assign::list_of(1)(2)(3)(4);

Or:

#include 
using namespace boost::assign;
...
std::vector v;
v += 1, 2, 3, 4;

Αλλά να έχετε κατά νου ότι αυτό έχει κάποια επιβάρυνση (βασικά, το list_of κατασκευάζει ένα std::deque κάτω από την κουκούλα), οπότε για κώδικα με κρίσιμες επιδόσεις θα ήταν καλύτερα να κάνετε αυτό που λέει ο Yacoby.

Σχόλια (3)
Λύση

Μια μέθοδος θα ήταν να χρησιμοποιήσετε τον πίνακα για να αρχικοποιήσετε το διάνυσμα

static const int arr[] = {16,2,77,29};
vector vec (arr, arr + sizeof(arr) / sizeof(arr[0]) );
Σχόλια (11)

Στη C++0x θα μπορείτε να το κάνετε με τον ίδιο τρόπο που το κάνατε με έναν πίνακα, αλλά όχι στο τρέχον πρότυπο.

Με μόνη γλωσσική υποστήριξη μπορείτε να χρησιμοποιήσετε:

int tmp[] = { 10, 20, 30 };
std::vector v( tmp, tmp+3 ); // use some utility to avoid hardcoding the size here

Αν μπορείτε να προσθέσετε άλλες βιβλιοθήκες θα μπορούσατε να δοκιμάσετε boost::assignment:

vector v = list_of(10)(20)(30);

Για να αποφύγετε τον σκληρό προγραμματισμό του μεγέθους ενός πίνακα:

// option 1, typesafe, not a compile time constant
template 
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 
char (&sizeof_array( T(&)[N] ))[N];    // declared, undefined
#define ARRAY_SIZE(x) sizeof(sizeof_array(x))
Σχόλια (9)