IT story

C 스타일 배열에서 std :: vector를 초기화하는 방법은 무엇입니까?

hot-time 2020. 6. 10. 08:05
반응형

C 스타일 배열에서 std :: vector를 초기화하는 방법은 무엇입니까?


std::vectorC 스타일 배열에서 초기화하는 가장 저렴한 방법은 무엇입니까 ?

예 : 다음 클래스에는가 vector있지만 외부 제한으로 인해 데이터가 C 스타일 배열로 전달됩니다.

class Foo {
  std::vector<double> w_;
public:
  void set_data(double* w, int len){
   // how to cheaply initialize the std::vector?
}

분명히, w_.resize()요소를 호출 한 다음 반복하거나을 호출 할 수 있습니다 std::copy(). 더 나은 방법이 있습니까?


포인터를 반복자로 취급 할 수 있다는 것을 잊지 마십시오.

w_.assign(w, w + len);

initialize라는 단어를 사용하여 이것이 일회성 할당인지 또는 여러 번 발생할 수 있는지 확실하지 않습니다.

한 번만 초기화하면 생성자에 두 개의 반복자 벡터 생성자를 사용할 수 있습니다.

Foo::Foo(double* w, int len) : w_(w, w + len) { }

그렇지 않으면 이전에 제안한대로 assign을 사용하십시오.

void set_data(double* w, int len)
{
    w_.assign(w, w + len);
}

파벨은 가까웠지만 ac 스타일 배열에서 순차적 컨테이너를 초기화하는 더 간단하고 우아한 솔루션이 있습니다.

귀하의 경우 :

w_ (array, std::end(array))
  • 배열은 배열의 시작 부분에 대한 포인터를 얻습니다 (이름을 잡지 못함).
  • std :: end (array)는 배열 끝에 반복자를 가져옵니다.

배열의 크기를 자동으로 '학습'할 수 있습니다.

template<typename T, size_t N>
void set_data(const T (&w)[N]){
    w_.assign(w, w+N);
}

위와 같이 인터페이스를 set_data로 변경할 수 있기를 바랍니다. 여전히 C 스타일 배열을 첫 번째 인수로 사용합니다. 그것은 단지 참조로 가져옵니다.


작동 원리

[업데이트 : 크기 학습에 대한보다 포괄적 인 논의는 여기참조 하십시오 ]

더 일반적인 해결책은 다음과 같습니다.

template<typename T, size_t N>
void copy_from_array(vector<T> &target_vector, const T (&source_array)[N]) {
    target_vector.assign(source_array, source_array+N);
}

이것은 배열이 배열에 대한 참조로 전달되기 때문에 작동합니다. C / C ++에서는 배열을 함수로 전달할 수 없으며 대신 포인터로 쇠약 해지고 크기를 잃게됩니다. 그러나 C ++에서는 배열에 대한 참조를 전달할 수 있습니다 .

참조로 배열을 전달하려면 형식이 정확히 일치해야합니다. 배열의 크기는 해당 유형의 일부입니다. 즉, 템플릿 매개 변수 N을 사용하여 크기를 알 수 있습니다.

벡터를 반환하는이 함수를 사용하는 것이 더 간단 할 수도 있습니다. 적절한 컴파일러 최적화가 적용되면 보이는 것보다 빠릅니다.

template<typename T, size_t N>
vector<T> convert_array_to_vector(const T (&source_array)[N]) {
    return vector<T>(source_array, source_array+N);
}

std::vector<double>::assign코드적기 때문에 갈 길 입니다. 그러나 실제로 어떻게 작동합니까? 크기를 조정 한 다음 복사하지 않습니까? STL의 MS 구현에서는 정확히 사용하고 있습니다.

귀하의를 (재) 초기화하는 더 빠른 방법 이 없을까 걱정 std::vector됩니다.

참고 URL : https://stackoverflow.com/questions/2434196/how-to-initialize-stdvector-from-c-style-array

반응형