배열을 벡터로 변환하는 가장 간단한 방법은 무엇입니까?
void test(vector<int> _array)
{
...
}
int x[3]={1, 2, 3};
test(x); // Syntax error.
가장 간단한 방법으로 x를 int 배열에서 벡터로 변환하고 싶습니다.
답변
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]
한 요소 를 가리 킵니다 .
답변
개인적으로 저는 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 });
답변
포인터는 다른 반복자처럼 사용할 수 있습니다.
int x[3] = {1, 2, 3};
std::vector<int> v(x, x + 3);
test(v)
답변
여기서 잘못된 질문을하고 있습니다. 모든 것을 벡터로 강제하는 대신 테스트를 특정 컨테이너 대신 반복기로 작업하도록 변환하는 방법을 묻습니다. 호환성을 유지하고 다른 컨테이너를 무료로 동시에 처리하기 위해 과부하를 제공 할 수도 있습니다.
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 데모 )
답변
한 가지 간단한 방법은 클래스에 assign()
미리 정의 된 함수를 사용하는 것입니다 vector
.
예 :
array[5]={1,2,3,4,5};
vector<int> v;
v.assign(array, array+5); // 5 is size of array.