2016-10-03 2 views

답변

4

당신은 for 루프 또는 std::for_each와 조합 std::fill를 사용한다 : 여기

for (auto &v: vec) { 
    std::fill(v.begin(), v.end(), 0); 
} 

std::fill 가능성 (괜찮은 컴파일러 및 최적화 플래그) std::memset 다시 하나의 호출에 떨어질 것이다, 그러나 당신은 필요 for 첫 번째 차원입니다.

2-D std::vector은 단일 메모리 블록이 아니므로 모든 것을 한 번에 0으로 재설정 할 방법이 없습니다.

1

당신은 표준 std::fillstd::for_each 알고리즘을 사용할 수 있습니다 즉시 반복하지 않고 한 번에 std::vector의 여러 요소를 설정하는 방법은 없습니다 :이 알고리즘은 내부적으로 루프로 구현되는 것을

std::vector<std::vector<int>> vec; 

// Iterate over the first dimension of vectors... 
std::for_each(vec.begin(), vec.end(), [](std::vector<int>& inner_vec) 
    { 
     // ...fill every inner vector with zeros. 
     std::fill(inner_vec.begin(), inner_vec.end(), 0); 
    }); 

참고.

+0

실제로'std :: fill'은 (for std :: vector '에 대해서, gcc 6.2는'std :: memset'을 직접적으로 사용합니다.) 컴파일러에 의해 (for) 루프를 사용하지 않도록 (쉽게) 최적화 될 수 있습니다. – Holt

+0

@Holt : 실제로 libstdC++ 개발자가'std :: memset'로 구현 했나요? 아니면'for' 루프를 최적화하는 컴파일러입니까? 컴파일러는 이러한 사소한 상황에서'for'를'memset'와 동일한 코드로 변환 할 수 있습니다. –

+1

컴파일러는 최적화 된 컴파일러이지만'std :: fill' 내부의'for' 루프뿐만 아니라'std :: fill'에 대한 호출이기 때문에 위의 루프 본문은 기본적으로'std :: memset (inner_vec 요점은 성능 문제 때문에'std :: fill'를 두려워해서는 안된다는 것입니다 (즉, .data(), 0, (inner_vec.end() - inner_vec.begin()) * sizeof (int))' 대부분의 경우 최적화 됨). – Holt

관련 문제