programing

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

javajsp 2023. 7. 3. 22:33

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

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

예:다음 수업에서, 나는vector그러나 외부의 제한으로 인해 데이터는 C-style 배열로 전달됩니다.

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

이니셜라이즈라는 단어를 사용하면 이 작업이 일회성 작업인지 여러 번 수행될 수 있는지 알 수 없습니다.

한 번만 초기화해야 하는 경우 생성자에 초기화를 넣고 두 개의 반복 벡터 생성자를 사용할 수 있습니다.

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

그렇지 않으면 이전에 제안한 대로 할당을 사용합니다.

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

파벨은 근접했지만, C 스타일 배열에서 순차적 컨테이너를 초기화할 수 있는 더 간단하고 우아한 솔루션이 있습니다.

당신의 경우:

w_ (array, std::end(array))
  • 배열은 배열의 시작 부분에 대한 포인터를 제공합니다(이름을 인식하지 못합니다).
  • std::end(array)는 반복기를 배열의 끝으로 가져옵니다.

일반적인 빠른 답변:

std::vector<double> vec(carray,carray+carray_size); 

또는 특정 질문:

std::vector<double> w_(w,w+len); 

기준:포인터를 반복기로 처리할 수 있음을 잊지 마십시오.

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

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);
}

이는 배열이 참조-an-array로 전달되고 있기 때문에 작동합니다.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