c++ - 是否有必要通过常量引用传递迭代器

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

问题> 哪个函数更好(即 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/

相关文章:

c++ - 如何在 Eclipse 中调试 R 包(使用 C 和 C++ 代码)?

c++ - QT 使用 QGraphics 在一条直线上绘制椭圆或三角形

c++ - 为什么 RH 编译程序的大小是 Ubuntu 编译程序的 4 倍

c++ - Qt输出pdf为空

c++ - 二进制搜索以任意数量的字节编码的整数列表

C++ MFC CComboBox 为空

c++ - 我是否正确理解指针? C++

c++ - matlab reshape 和置换函数的 C/C++ 替代方案

C++ - 如何获取用户文件夹?

c++ - 使用 std::list 时内存泄漏