배열을 벡터로 변환하는 가장 간단한 방법은 무엇입니까?


94

배열을 벡터로 변환하는 가장 간단한 방법은 무엇입니까?

void test(vector<int> _array)
{
  ...
}

int x[3]={1, 2, 3};
test(x); // Syntax error.

가장 간단한 방법으로 x를 int 배열에서 벡터로 변환하고 싶습니다.

답변:


140

vector두 개의 반복기를 사용하는 생성자를 사용하고 포인터는 유효한 반복기이며 배열에서 포인터로의 암시 적 변환을 사용합니다.

int x[3] = {1, 2, 3};
std::vector<int> v(x, x + sizeof x / sizeof x[0]);
test(v);

또는

test(std::vector<int>(x, x + sizeof x / sizeof x[0]));

이 맥락에서 sizeof x / sizeof x[0]분명히 어디에 있습니까 3? 배열의 요소 수를 얻는 일반적인 방법입니다. 마지막 요소를 넘어서x + sizeof x / sizeof x[0] 한 요소 를 가리 킵니다 .


1
설명해 주시겠습니까? 나는 이미 읽을 vector<int> a(5,10);평균 make room for 5 int`을하고는 10.하지만 어떻게 당신의 X, X + ... 작품 초기화? 설명 할 수 있습니까?
아시프 Mushtaq

1
오히려 선택보다 @UnKnown vector<int>::vector(size_type, int), 그 선택 vector<int>::vector(int*, int*)범위가 포인터의 페어로 표시되는 사본. 첫 번째는 과부하 (2), 두 번째는 과부하 (4) 여기
Caleth

1
C ++ 11에서는 std :: extent가 sizeof 메서드보다 낫습니다. sizeof x / sizeof x[0] == std::extent<decltype(x)>::value
이삭 파스 쿠알

115

개인적으로 저는 C ++ 2011 접근 방식을 아주 좋아합니다 sizeof(). 배열 경계를 변경 한 경우 사용 하거나 배열 경계를 조정하는 것을 기억할 필요가 없기 때문입니다 (원하는 경우 C ++ 2003에서 관련 함수도 정의 할 수 있음). ) :

#include <iterator>
#include <vector>
int x[] = { 1, 2, 3, 4, 5 };
std::vector<int> v(std::begin(x), std::end(x));

분명히 C ++ 2011에서는 이니셜 라이저 목록을 사용하고 싶을 수도 있습니다.

std::vector<int> v({ 1, 2, 3, 4, 5 });

2
배열을 복사합니까 아니면 단지 그것을 가리 킵니까? 성능에 관심이 있습니다
kirill_igum 2011

2
std::vector<T>항상 T개체를 소유 합니다. 여기에는 두 가지 의미가 있습니다. 객체를 벡터에 삽입 할 때 복사되고 메모리에 배치됩니다. 합리적으로 작은 개체 (예 : 짧은 문자열 시퀀스)의 경우 배열이 성능을 크게 향상시킵니다. 개체가 크고 복사 비용이 많이 드는 경우 개체에 대한 포인터를 [어떻게 든 리소스 관리] 저장하는 것이 좋습니다. 어떤 접근 방식이 더 효율적인지는 객체에 따라 다르지만 선택할 수 있습니다.
Dietmar Kühl 2012

그래서 내가 C ++ 및 ac 라이브러리를 인터페이스하고 c-array에서 벡터로 복사하고 싶다면 2 개의 벌금을 지불 할 방법이 없습니까? (저는 고유 라이브러리와 gsl을 사용하고 있습니다)
kirill_igum 2011

16

포인터는 다른 반복자처럼 사용할 수 있습니다.

int x[3] = {1, 2, 3};
std::vector<int> v(x, x + 3);
test(v)

2
실생활에서는 배열 크기 const size_t X_SIZE = 3;를 표시하는 데 사용 하거나 sizeof에서 계산하는 등 배열 크기 를 추상화 할 수 있습니다 . 가독성을 위해이 부분을 생략했습니다.
Rafał Rawicki

11

여기서 잘못된 질문을하고 있습니다. 모든 것을 벡터로 강제하는 대신 테스트를 특정 컨테이너 대신 반복기로 작업하도록 변환하는 방법을 묻습니다. 호환성을 유지하고 다른 컨테이너를 무료로 동시에 처리하기 위해 과부하를 제공 할 수도 있습니다.

void test(const std::vector<int>& in) {
  // Iterate over vector and do whatever
}

된다 :

template <typename Iterator>
void test(Iterator begin, const Iterator end) {
    // Iterate over range and do whatever
}

template <typename Container>
void test(const Container& in) {
    test(std::begin(in), std::end(in));
}

다음을 수행 할 수 있습니다.

int x[3]={1, 2, 3};
test(x); // Now correct

( Ideone 데모 )


"모든 것을 벡터로 강제하는 대신 특정 컨테이너 대신 반복기를 사용하도록 테스트를 변환 할 수있는 방법을 묻습니다." 왜 이것이 더 낫습니까?
aquirdturtle

1
@aquirdturtle 지금은 벡터 만 지원하는 대신 목록과 배열을 지원하고 컨테이너를 강화하고 반복기와 범위를 변환하고 ....
Flexo

2
데이터를 복사 할 필요가 없습니다
Lightness Races in Orbit

2

한 가지 간단한 방법은 클래스에 assign()미리 정의 된 함수를 사용하는 것입니다 vector.

예 :

array[5]={1,2,3,4,5};

vector<int> v;
v.assign(array, array+5); // 5 is size of array.

2
약 7 년 전에 기존 답변에서 언급 된 ctor의 사용과 동일합니다. 아무것도 추가하지 않습니다 ...
궤도의 가벼운 경주
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.