0

동안 발전기를 통해 초기화되지 않은 0이 아닌 값 또는 예뻐으로 생산 (유사에 std::generate_n()) 생성자 인수를 새로운 std::vector를 구성하는 방법이 있나요 원하는 비표준 (비 상수) 값 없이 모든 요소를 ​​0으로 초기화 하시겠습니까? 이것은 (무작위) 모형 생성 API가 가능한 한 지역 효율적이기를 원하기 때문에 컨테이너 요소를 한 번만 작성해야하기 때문입니다. std::vector (및 다른 경우도 가능) 발전기 생성자를 사용하는 것이 깔끔하지 않습니까? 왜 C++이 표준에 이미 이것을 추가하지 않았습니까? ,비 상수 발전기 단일 패스 초기화 건설

// Allocate-and-Generate a random int array of length \p n. 
int * gen_rand(size_t n) 
{ 
    int *v = malloc(n); // allocate only 
    for (size_t i=0; i<n; i++) { 
    v[i] = rand(); // first write 
    } 
} 

나는 그것이 사용되는 STL 할당 자의 행동에 귀결 생각 :

다음 생성자 같은 C의 기능은 내가 std::vector의 사용자 정의 초기화 건설을 추구 쓰기 번 동작을 보여줍니다 처음 0을 쓰는 책임이 있기 때문입니다.

반복자를 사용하여 std::vector 생성자를 사용하는 경우 먼저 push_back()을 사용하는 것보다 더 나쁜 임의의 값을 할당하고 작성해야합니다.

+0

반복자는이 작업을 수행하는 방법입니다. http://www.boost.org/doc/libs/1_48_0/libs/iterator/doc/counting_iterator.html – Lalaland

+0

@EthanSteinberg : std :: vector의 반복기 솔루션은'push_back()'을 사용해야한다. 효율적이거나 다시 요소에 두 번 쓰게됩니다. 'std :: list'와 같은 다른 것들에 대해서, 반복자는 좋은 해결책이 될 수 있습니다. –

+0

생성자에서 반복자를 사용할 수 있습니다 ... – Lalaland

답변

3

발전기를 사용하기 전에 vector::reserve을 호출 할 수 있습니다. 이것은 당신이 보여주는 C 코드와 똑같은 행동을합니다. vector의 크기가 여전히 0 일 때까지 back_insert_iterator을 사용해야합니다.

#include <vector> 
#include <cstdlib> 
#include <algorithm> 
#include <iterator> 
#include <iostream> 


int main() 
{ 
    std::vector<int> v; 
    v.reserve(10); 
    std::generate_n(std::back_inserter(v), 10, []() { return rand(); }); 
    for(auto x : v) 
    std::cout << x << std::endl; 
    // unsafe version 
    std::vector<int> v2; 
    // 10 uninitialized integers 
    v2.resize(10); 
    // make sure never to write more than the exact amount, otherwise this will be UB 
    std::generate_n(v.begin(), 10, []() { return rand(); }); 

    return 0; 
} 
+0

아마도 C++ 버전에서 반복 중에 벡터 크기 검사와 관련된 몇 가지 추가 조건문이 추가되지만 재 할당은 필요하지 않을 수 있습니다. 충분히 닫으십시오. –

+0

@ Nordlöw 벡터의 크기는 push_back 연산에 대해서만 검사됩니다. 'resize'는'capacity' 만 체크합니다. 필자는 안전하지 않다고 생각하지만이를 피할 수있는 버전을 추가했습니다. – pmr