是否有必要通过const引用传递迭代器

时间:2013-06-27 02:53:45

标签: c++

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; 
    }
};

问题&gt;哪个功能更好(即更新或更新)?如果你有一个更好的,请提议。

谢谢

1 个答案:

答案 0 :(得分:19)

1)首先,要回答标题中的问题,必需通过(const)引用传递迭代器:否。迭代器充当代理容器中的数据项,无论迭代器本身是否是另一个迭代器的副本或引用。同样,当迭代器通过对容器执行的某些操作失效时,无论是通过复制还是引用来维护迭代器都不会产生影响。

2)其次,两个选项中哪一个更好。

我会通过副本传递迭代器(即你的第二个选项)。

经验法则是:如果您想要修改传递给函数的原始变量,或者如果您传递的对象很大并且复制它需要付出巨大努力,则按引用传递。

这里也不是这样的:迭代器是小而轻量级的对象,并且鉴于你建议使用const-reference,你也很清楚你不想对它进行修改,你希望在传递的变量中反映出来这个功能。

3)作为第三种选择,我希望您考虑在您的第二个选项中添加const

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

这可确保您不会在函数内意外重新分配iter,但仍允许您修改iter引用的原始容器项。它也可以为编译器提供某些优化的机会(尽管在你问题中的一个简单情况下,这些优化可能会被应用)。