11
class T
{
    unordered_map<string, int> table;
    ...

    void updateA(const unordered_map<string, int>::iterator& iter)
    {
        iter->second = 100; 
    }

    void updateB(unordered_map<string, int>::iterator iter)
    {
        iter->second = 100; 
    }
};

質問> updateA と updateB のどちらの機能が優れていますか? より良いものがあれば、提案してください。

ありがとうございました

4

1 に答える 1

22

1)まず、タイトルの質問に答えるには、イテレータを (const) 参照で渡す必要がありますか: いいえ。イテレータ自体がコンテナ内のデータ項目のプロキシとして機能します。別の反復子のコピーまたは参照。また、コンテナーに対して実行された何らかの操作によってイテレーターが無効化された場合、それをコピーまたは参照のどちらで維持するかに違いはありません。

2)次に、2 つのオプションのどちらが優れているか。

イテレータをコピーで渡します(つまり、2番目のオプション)。

経験則は次のとおりです。関数に渡された元の変数を変更する場合、または渡すオブジェクトが大きく、コピーに多大な労力が必要な場合は、参照渡しを使用します。

ここでもそうではありません。イテレータは小さくて軽量なオブジェクトであり、const-reference を提案したことを考えると、関数に渡される変数に反映させたい変更を加えたくないことも明らかです。 .

3) 3 番目のオプションとして、2 番目のオプションに追加constすることを検討してください。

void updateC(const unordered_map<string,int>::iterator iter)
{
    iter->second = 100; 
}

これにより、関数内で誤って再割り当てすることがなくなりますがiter、 によって参照される元のコンテナー アイテムを変更することができますiter。また、コンパイラーに特定の最適化の機会を与える場合もあります (ただし、質問のような単純な状況では、これらの最適化が適用される可能性があります)。

于 2013-06-27T03:36:23.150 に答える