4

さまざまなSTLオブジェクトと関数の標準を見ると、私には意味がありません。コンテナオブジェクトのbegin()関数とend()関数が、定数参照ではなく値でイテレータを返すのはなぜですか。イテレータはコンテナオブジェクトによって内部的に保持され、コンテナが変更されるたびに調整される可能性があるように思われます。これにより、次のようなforループで不要な一時的なものを作成するコストが軽減されます。

for (std::vector<int>::iterator it=my_vec.begin(); it!=my_vec.end(); ++it){
    //do things
}

これは有効な懸念事項ですか?これを悪い考えにするイテレータへの参照を使用することについて何かありますか?ほとんどのコンパイラ実装は、とにかくこの懸念を最適化しますか?

4

3 に答える 3

5

イテレータは、軽量でコピー可能(および割り当て可能)になるように設計されています。たとえば、ベクトルの場合、イテレータは文字通り単なるポインタである可能性があります。さらに、イテレータの全体的なポイントは、アルゴリズムをコンテナから切り離すことです。したがって、コンテナは、他の誰かが現在保持しているイテレータの種類をまったく気にする必要はありません。

于 2013-02-26T19:42:07.290 に答える
5

beginandメソッドが参照を返した場合end、コンテナーはそれらの各イテレーターをメンバーとして持つように強制されます。標準の人々は、可能な限り多くの柔軟性を実装に任せようとします。

たとえば、標準のコンテナとして動作し、余分なメモリを消費しない配列の単純なラッパーを作成できます。このラッパーにイテレーターを含める必要がある場合は、それほど単純でも小さくもなりません。

于 2013-02-26T19:57:13.300 に答える
0

さて、あなたが正しいイテレータを選択した場合、STLは:-)

for (
    std::vector<int>::const_iterator it=my_vec.begin(), 
    end=my_vec.end(); 
    it!=end; 
    ++it)
{
    //do things
}

STLのイテレータにはポインタセマンティックがあります。Constイテレータにはconstポインタセマンティックがあります。

于 2013-02-26T19:58:10.940 に答える