2016-06-05 5 views
0

동일한 크기의 벡터 벡터를 만들려면 하나의 초기화 줄을 사용하여 어떻게해야합니까?중첩 된 벡터의 크기 초기화

예컨대

std::vector<std::vector<int>> vv(5)은 기본적으로 5 개의 벡터를 초기화하지만이 5 개의 벡터를 크기로 초기화하는 방법은 무엇입니까? 다음과 같은

+2

을하거나 사본을 수정하고 모든 공간을 제거합니다. 그러나 그것은 한 줄 초기화가 아닙니다. – interjay

+0

C++ 배열을 사용하지 않는 이유는 무엇입니까? 다음 줄에 resize를 사용하고 아래의 해결책 ('... vv (5, std :: vector (5, 0));')을 사용하는 것이 좋습니다. int 값 대신에'OP' 로직을 기반으로하는 크기가 1 인 int 배열을 사용할 수 있습니다. – lllllllllll

답변

4

:

std::vector< std::vector<int> > vv(5, std::vector<int>(5, 0)); // Initialize with 0 
0

를 사용하여 2 개의 인수를 생성자 :하지만

std::vector<std::vector<int> > vv(5, std::vector<int>(5)); 

하지 않습니다 매우 효율적.

+0

더 효율적인 방법이 있습니까? – Chara

+0

@Chara, 효율적인 코드를 찾고 있다면 2D 벡터가 좋지 않습니다. 모든 내부 벡터가 동일한 길이를 가져야하는 경우, 행렬 클래스를 사용할 수 있습니다. 미리 길이를 알고 있다면'std :: array'. – chris

0

람다는 하나의 라인이 실제로 원하는 것일 경우 매우 복잡한 초기화를 허용합니다.

이 문장은

auto vv = [] { 
    int i = 0; 
    std::vector<std::vector<int>> result; 
    result.reserve(5); 
    std::generate_n(std::back_inserter(result), 
        5, 
        [&i]{ 
         auto v = std::vector<int>(); 
         v.reserve(5); 
         std::generate_n(std::back_inserter(v), 5, [&i]{ return i++; }); 
        return v; 
        }); 
    return result; 
    }(); 

당신이 단순히 한 줄에 원하는 경우 ... 순서를 포함 각각 5 개 벡터, 0-4, 5-9, 10-14의 벡터를 생성 (... 아니, 난 정말이 조언을하지 않는다)

자동차 및 i``@lllllllllll

auto vv = [] { int i = 0; std::vector<std::vector<int>> result; result.reserve(5); std::generate_n(std::back_inserter(result), 5, [&i]{ auto v = std::vector<int>(); v.reserve(5); std::generate_n(std::back_inserter(v), 5, [&i]{ return i++; }); return v; }); return result; }(); 
+1

참고로,'std :: iota'는'std :: generate_n' 호출이하는 일을합니다. – chris

+0

@chris 그래서 적어도 내부 루프를 위해서. 그래도 바깥 쪽의 값을 추적해야합니다. –

+0

그래, 두 가지 차원 (표준에는 존재하지 않음)을 통과하는 iterator를 사용하거나 사용합니다. 양자 택일로,'array_view'는 그것을 하나의 차원으로 취급하고 그것을 통해 반복합니다. – chris