루프를 사용하지 않고 벡터 크기를 유지하지 않고 vector<vector<int>>
의 모든 값을 0으로 재설정하는 방법.2D 벡터의 모든 값을 재설정하는 가장 빠른 방법은 무엇입니까?
답변
당신은 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
으로 재설정 할 방법이 없습니다.
당신은 표준 std::fill
및 std::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);
});
참고.
실제로'std :: fill'은 (for std :: vector
@Holt : 실제로 libstdC++ 개발자가'std :: memset'로 구현 했나요? 아니면'for' 루프를 최적화하는 컴파일러입니까? 컴파일러는 이러한 사소한 상황에서'for'를'memset'와 동일한 코드로 변환 할 수 있습니다. –
컴파일러는 최적화 된 컴파일러이지만'std :: fill' 내부의'for' 루프뿐만 아니라'std :: fill'에 대한 호출이기 때문에 위의 루프 본문은 기본적으로'std :: memset (inner_vec 요점은 성능 문제 때문에'std :: fill'를 두려워해서는 안된다는 것입니다 (즉, .data(), 0, (inner_vec.end() - inner_vec.begin()) * sizeof (int))' 대부분의 경우 최적화 됨). – Holt
가장 빠른 방법은 루프를 사용하는 것입니다. – LogicStuff