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

Question> 哪个函数更好(即updateA或updateB)?如果你有更好的,请提出。

谢谢

4

1 回答 1

22

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

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

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

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

这里也不是这种情况:迭代器是小型轻量级对象,并且鉴于您建议使用 const 引用,很明显您不想对其进行修改以反映在传递给函数的变量中.

3)作为第三个选项,我希望您考虑添加const到您的第二个选项:

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

这确保您不会意外地iter在函数内部重新分配,但仍然允许您修改iter. 它还可能使编译器有机会进行某些优化(尽管在您问题中的简单情况下,这些优化可能会被应用)。

于 2013-06-27T03:36:23.150 回答