Ich kann ein Array erstellen und es wie folgt initialisieren:
int a[] = {10, 20, 30};
Wie kann ich einen std::vector
erstellen und ihn ähnlich elegant initialisieren?
Der beste Weg, den ich kenne, ist:
std::vector<int> ints;
ints.push_back(10);
ints.push_back(20);
ints.push_back(30);
Gibt es einen besseren Weg?
Wenn Ihr Compiler C++11 unterstützt, können Sie dies einfach tun:
std::vector<int> v = {1, 2, 3, 4};
Dies ist in GCC [ab Version 4.4] verfügbar (http://gcc.gnu.org/projects/cxx0x.html). Leider scheint VC++ 2010 in dieser Hinsicht im Rückstand zu sein.
Alternativ verwendet die Bibliothek Boost.Assign Nicht-Makro-Magie, um das Folgende zu ermöglichen:
#include <boost/assign/list_of.hpp>
...
std::vector<int> v = boost::assign::list_of(1)(2)(3)(4);
Oder:
#include <boost/assign/std/vector.hpp>
using namespace boost::assign;
...
std::vector<int> v;
v += 1, 2, 3, 4;
Aber bedenken Sie, dass dies einen gewissen Overhead hat (im Grunde konstruiert list_of
eine std::deque
unter der Haube), so dass Sie bei leistungsrelevantem Code besser tun sollten, was Yacoby sagt.
Eine Methode wäre, das Array zur Initialisierung des Vektors zu verwenden
static const int arr[] = {16,2,77,29};
vector<int> vec (arr, arr + sizeof(arr) / sizeof(arr[0]) );
In C++0x können Sie dies auf die gleiche Weise wie bei einem Array tun, aber nicht im aktuellen Standard.
Mit nur Sprachunterstützung können Sie verwenden:
int tmp[] = { 10, 20, 30 };
std::vector<int> v( tmp, tmp+3 ); // use some utility to avoid hardcoding the size here
Wenn Sie andere Bibliotheken hinzufügen können, können Sie boost::assignment verwenden:
vector<int> v = list_of(10)(20)(30);
Um das Hardcoding der Größe eines Arrays zu vermeiden:
// 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))