c++ - 按值与按引用传递标准算法迭代器参数

标签 c++ templates stl

我想知道为什么在 STL 的许多模板算法中,参数不是通过引用传递,而是通过值传递。这是 <iterator 中的一个示例> 标题:

template<class InputIterator>
typename iterator_traits<InputIterator>::difference_type
distance (InputIterator first, InputIterator last);

当我将两个迭代器传递给这个函数时,它们会被复制。我天真的想法是最好通过 const-reference 传递这些迭代器以避免复制迭代器对象:

template<class InputIterator>
typename iterator_traits<InputIterator>::difference_type
distance (const InputIterator &first, const InputIterator &last);

可以说迭代器通常是非常小的对象,复制它们并不昂贵。但即便如此:便宜的复制比不复制要贵。

那么在 STL 版本中,迭代器是按值传递的原因是什么?

谢谢!

最佳答案

我想到的一件事是违反引用中的 const 特性:迭代器在使用时需要修改。

另一个实现细节可能是迭代器实际上只是作为指针实现的。在大多数情况下,引用也是如此。如果按值传递指针,则复制一次,但仅在需要时取消引用它。但是,如果迭代器指针本身由引用指针传递,则 那个 strong> 必须首先取消引用,只是为了到达迭代器,并且每次访问迭代器时都必须这样做。那是多余的。

关于c++ - 按值与按引用传递标准算法迭代器参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17988299/

相关文章:

c++ - Windows XP上的“is not a valid win32 application”

c++ - 处理组合关系中的变量

c++ - 如何等待文件存在(并被释放)?

c++ - 为什么当我向作为 std::mem_fun() 参数的成员函数添加引用参数时编译错误?

c++ - 是否有 std::function 的独立实现?

c++ - 什么是 c c++ 的最佳数据库连接支持库框架?

php - 如何在 Laravel 5 中制作 php 布局?

c++ - 匹配别名模板作为模板参数

javascript - Meteor.js 模板回显不起作用

c++ - STL::vector 无法分配内存 'randomly'