Bir dizi oluşturabilir ve onu şu şekilde başlatabilirim:
int a[] = {10, 20, 30};
Nasıl bir std::vector
oluşturabilir ve benzer şekilde zarif bir şekilde başlatabilirim?
Bildiğim en iyi yol şu:
std::vector<int> ints;
ints.push_back(10);
ints.push_back(20);
ints.push_back(30);
Daha iyi bir yolu var mı?
Derleyiciniz C++11'i destekliyorsa, basitçe yapabilirsiniz:
std::vector<int> v = {1, 2, 3, 4};
Bu, GCC'de [4.4 sürümünden itibaren] mevcuttur (http://gcc.gnu.org/projects/cxx0x.html). Ne yazık ki, VC++ 2010 bu konuda geride kalmış gibi görünüyor.
Alternatif olarak, Boost.Assign kütüphanesi aşağıdakilere izin vermek için makro olmayan sihir kullanır:
#include <boost/assign/list_of.hpp>
...
std::vector<int> v = boost::assign::list_of(1)(2)(3)(4);
Ya da:
#include <boost/assign/std/vector.hpp>
using namespace boost::assign;
...
std::vector<int> v;
v += 1, 2, 3, 4;
Ancak bunun bazı ek yükleri olduğunu unutmayın (temel olarak, list_of
kaputun altında bir std::deque
oluşturur), bu nedenle performans açısından kritik kodlar için Yacoby'nin dediği gibi yapmanız daha iyi olacaktır.
C++0x'te bunu bir dizi ile yaptığınız şekilde yapabileceksiniz, ancak mevcut standartta değil.
Sadece dil desteği ile kullanabilirsiniz:
int tmp[] = { 10, 20, 30 };
std::vector<int> v( tmp, tmp+3 ); // use some utility to avoid hardcoding the size here
Eğer başka kütüphaneler ekleyebiliyorsanız boost::assignment'ı deneyebilirsiniz:
vector<int> v = list_of(10)(20)(30);
Bir dizinin boyutunu sabit kodlamaktan kaçınmak için:
// 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))