하드 코딩 된 요소로 std :: vector를 초기화하는 가장 쉬운 방법은 무엇입니까? = {10,

배열을 만들고 다음과 같이 초기화 할 수 있습니다.

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

어떻게 std::vector우아하게 만들고 우아하게 초기화합니까?

내가 아는 가장 좋은 방법은 다음과 같습니다.

std::vector<int> ints;

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

더 좋은 방법이 있습니까?



답변

한 가지 방법은 배열을 사용하여 벡터를 초기화하는 것입니다.

static const int arr[] = {16,2,77,29};
vector<int> vec (arr, arr + sizeof(arr) / sizeof(arr[0]) );


답변

컴파일러가 C ++ 11을 지원하는 경우 다음을 수행하면됩니다.

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

이것은 4.4 버전 부터 GCC에서 사용할 수 있습니다 . 불행하게도, VC ++ 2010은 이런 점에서 뒤쳐져있는 것 같습니다.

또는 Boost.Assign 라이브러리는 비 매크로 매직을 사용하여 다음을 허용합니다.

#include <boost/assign/list_of.hpp>
...
std::vector<int> v = boost::assign::list_of(1)(2)(3)(4);

또는:

#include <boost/assign/std/vector.hpp>
using namespace boost::assign;
...
std::vector<int> v;
v += 1, 2, 3, 4;

이 (기본적으로, 약간의 오버 헤드를 가지고 그러나 명심 list_of을 구성 std::deque후드를) 당신이 Yacoby 말한대로 일을 더 나을 것 성능이 중요한 코드 때문에.


답변

가능하다면 현대적인 C ++ [11,14,17, …] 방식을 사용하십시오 :

std::vector<int> vec = {10,20,30};

가변 길이 배열을 반복하거나 사용하는 오래된 방법 sizeof()은 실제로 눈에 끔찍하며 정신적 오버 헤드 측면에서 완전히 필요하지 않습니다. 왝.


답변

C ++ 0x에서는 배열과 동일한 방식으로 수행 할 수 있지만 현재 표준에서는 불가능합니다.

언어 만 지원하면 다음을 사용할 수 있습니다.

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

다른 라이브러리를 추가 할 수 있다면 boost :: assignment를 시도 할 수 있습니다.

vector<int> v = list_of(10)(20)(30);

배열 크기를 하드 코딩하지 않으려면 다음을 수행하십시오.

// 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))


답변

C ++ 11에서 :

#include <vector>
using std::vector;
...
vector<int> vec1 { 10, 20, 30 };
// or
vector<int> vec2 = { 10, 20, 30 };

부스트 list_of 사용 :

#include <vector>
#include <boost/assign/list_of.hpp>
using std::vector;
...
vector<int> vec = boost::assign::list_of(10)(20)(30);

부스트 할당 사용 :

#include <vector>
#include <boost/assign/std/vector.hpp>
using std::vector;
...
vector<int> vec;
vec += 10, 20, 30;

기존의 STL :

#include <vector>
using std::vector;
...
static const int arr[] = {10,20,30};
vector<int> vec (arr, arr + sizeof(arr) / sizeof(arr[0]) );

일반 매크로가있는 기존의 STL :

#include <vector>
#define ARRAY_SIZE(ar) (sizeof(ar) / sizeof(ar[0])
#define ARRAY_END(ar) (ar + ARRAY_SIZE(ar))
using std::vector;
...
static const int arr[] = {10,20,30};
vector<int> vec (arr, ARRAY_END(arr));

벡터 이니셜 라이저 매크로가있는 기존의 STL :

#include <vector>
#define INIT_FROM_ARRAY(ar) (ar, ar + sizeof(ar) / sizeof(ar[0])
using std::vector;
...
static const int arr[] = {10,20,30};
vector<int> vec INIT_FROM_ARRAY(arr);


답변

방금 $ 0.02를 버릴 것이라고 생각했습니다. 나는 이것을 선언하는 경향이 있습니다.

template< typename T, size_t N >
std::vector<T> makeVector( const T (&data)[N] )
{
    return std::vector<T>(data, data+N);
}

유틸리티 헤더 어딘가에 필요한 모든 것은 다음과 같습니다.

const double values[] = { 2.0, 1.0, 42.0, -7 };
std::vector<double> array = makeVector(values);

그러나 C ++ 0x를 기다릴 수 없습니다. 코드가 Visual Studio에서 컴파일되어야하기 때문에 멈췄습니다. 우우.


답변

C ++ 11 이전 :

방법 1 =>

vector<int> v(arr, arr + sizeof(arr)/sizeof(arr[0]));
vector<int>v;

방법 2 =>

 v.push_back(SomeValue);

C ++ 11 이후도 가능합니다

vector<int>v = {1, 3, 5, 7};