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;哪个功能更好(即更新或更新)?如果你有一个更好的,请提议。
谢谢
答案 0 :(得分:19)
1)首先,要回答标题中的问题,必需通过(const)引用传递迭代器:否。迭代器充当代理容器中的数据项,无论迭代器本身是否是另一个迭代器的副本或引用。同样,当迭代器通过对容器执行的某些操作失效时,无论是通过复制还是引用来维护迭代器都不会产生影响。
2)其次,两个选项中哪一个更好。
我会通过副本传递迭代器(即你的第二个选项)。
经验法则是:如果您想要修改传递给函数的原始变量,或者如果您传递的对象很大并且复制它需要付出巨大努力,则按引用传递。
这里也不是这样的:迭代器是小而轻量级的对象,并且鉴于你建议使用const-reference,你也很清楚你不想对它进行修改,你希望在传递的变量中反映出来这个功能。
3)作为第三种选择,我希望您考虑在您的第二个选项中添加const
:
void updateC(const unordered_map<string,int>::iterator iter)
{
iter->second = 100;
}
这可确保您不会在函数内意外重新分配iter
,但仍允许您修改iter
引用的原始容器项。它也可以为编译器提供某些优化的机会(尽管在你问题中的一个简单情况下,这些优化可能会被应用)。