2016-10-03 3 views

答えて

4

あなたはforループまたはstd::for_eachとの組み合わせでstd::fillを使用する必要があります。ここでは

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

std::fillはおそらくバック(まともなコンパイラおよび最適化フラグ付き)std::memsetへの単一の呼び出しに分類されますが、あなたは必要とします第1次元の場合は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'を直接使用します)を使わないようにコンパイラによって簡単に最適化されます。 – Holt

+0

@Holt:実際にはlibstdC++開発者によって 'std :: memset'として実装されていますか、' for'ループを最適化するコンパイラですか?コンパイラはこれらの些細な状況で常に 'for'を' memset'に相当するコードに変換することができます。 –

+1

コンパイラは最適化されていますが、 'std :: fill'内の' for'ループだけでなく、 'std :: fill'も呼び出すので、上記のループ本体は基本的に' std :: memset(inner_vecポイントは、パフォーマンス問題のために 'std :: fill'を恐れてはいけないということです。ほとんどの場合最適化されます)。 – Holt

関連する問題