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
'programing' 카테고리의 다른 글
| Axios 응답 Vuex에서 작업을 호출하는 방법은 무엇입니까? (0) | 2023.07.03 |
|---|---|
| git - 병합 시 특정 커밋 건너뛰기 (0) | 2023.07.03 |
| 캐럿(^) 연산자는 무엇을 합니까? (0) | 2023.06.28 |
| 서브스크립션 배열 대신 SubSink를 사용하는 이유 (0) | 2023.06.28 |
| Oracle 및 SQL Server 성능 테스트를 게시하는 것은 라이센스 위반입니까? (0) | 2023.06.28 |