5

const_iteratorの意味を理解しようとしています。次のサンプルコードがあります。

void CustomerService::RefreshCustomers()
{
    for(std::vector<Customer*>::const_iterator it = customers_.begin();
        it != customers_.end() ; it ++)
    {
        (*it)->Refresh();
    }
}

Refresh()クラス内のメソッドであり、Customerconstとして定義されていません。最初は、const_iteratorがコンテナの要素への変更を許可しないことになっていると思いました。ただし、このコードは文句なしにコンパイルされます。これは、余分なレベルの間接参照が行われているためですか?const_iteratorは正確には何を意味しますか?

アップデート

そして、このような状況では、const_iteratorを使用するのがベストプラクティスですか?

4

3 に答える 3

10

const_iteratorオーバー aはvector<Customer*>あなたにCustomer * constないを与えますCustomer const*。したがって、反復される値 (ポインター) を実際に変更することはできませんが、それが指すオブジェクトを変更することはできます。基本的に、あなたのケースで言うことは、これを行うことができないということだけです:

*it = ..something..;
于 2011-11-04T23:49:45.567 に答える
4

コンテナの内容を変更していません。コンテナーの内容は単なるポインターです。ただし、ポインターが指すものは何でも自由に変更できます。

ポインターが指すものを変更できるようにしたくない場合は、vector<const Customer*>.

于 2011-11-04T23:50:40.940 に答える
2

const_iterator は、コンテナーを変更できるかどうかではなく、コンテナー内のオブジェクトを変更できるかどうかに関するものです。あなたの場合、コンテナーにはポインターが含まれており、ポインター自体を変更することはできません (整数を変更できる以上...) コレクションからのポインターの背後にある非 const Refresh() を呼び出すことができます。ポインター自体を変更しないでください。

const_iterator と iterator の違いは重要です [のみ] コンテナーにクラス インスタンスなど、それらへのポインターではなくインスタンス自体が含まれている場合 (コンテナーなど)

list < pair < int , int > >

「それ」がこのリストへの const_iterator である場合、実行できません

it->first = 5

ただし、イテレーター (const_iterator ではない) の場合は機能します。

于 2011-11-04T23:56:05.987 に答える