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;
}
};
问题> 哪个函数更好(即 updateS 或 update)?如果你有更好的,请提出。
谢谢
最佳答案
1) 首先,回答标题中的问题,是否有必要通过 (const) 引用传递迭代器:否。迭代器充当代理容器中的数据项,无论迭代器本身是否是另一个迭代器的拷贝或引用。此外,在迭代器因对容器执行的某些操作而失效的情况下,无论您是通过复制还是引用来维护它都不会产生影响。
2)其次,这两个选项哪个更好。
我会通过拷贝传递迭代器(即您的第二个选项)。
经验法则是:如果您想要修改传递给函数的原始变量,或者如果您传递的对象很大并且复制它需要付出很大的努力,则按引用传递。
这里也不是这种情况:迭代器是小的、轻量级的对象,鉴于您建议使用 const-reference,很明显您不想对其进行修改,而您希望反射(reflect)在传递的变量中到函数。
3) 作为第三个选项,我希望您考虑将 const
添加到您的第二个选项中:
void updateC(const unordered_map<string,int>::iterator iter)
{
iter->second = 100;
}
这确保您不会在函数内意外地重新分配 iter
,但仍然允许您修改 iter
引用的原始容器项。它还可能为编译器提供某些优化的机会(尽管在您问题中的简单情况下,这些优化可能会被应用)。
关于c++ - 是否有必要通过常量引用传递迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17333791/