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
'IT story' 카테고리의 다른 글
| MySQL 사용자 이름과 비밀번호를 어떻게 검색합니까? (0) | 2020.06.10 |
|---|---|
| 여러 조건이있는 AngularJS ng-if (0) | 2020.06.10 |
| 이름이 문자열 인 모든 파일 찾기 (0) | 2020.06.10 |
| 수집 (0) | 2020.06.10 |
| WebSocket과 순수 TCP의 근본적인 차이점은 무엇입니까? (0) | 2020.06.10 |