为什么在这个C++问题中使用const_iterator而不仅仅是迭代器?

Why is const_iterator used instead of just iterator in this C++ question?

本文关键字:iterator const 不仅仅是 迭代器 C++ 问题 为什么      更新时间:2023-10-16

我有一个C++的考试问题,对我来说没有意义。

问题:

使用以下库算法:

  • find(b, e, v)搜索范围[b, e)并返回一个迭代器,指向v的第一个匹配项,如果有,如果没有,则返回e

1.编写一个函数,该函数接受双精度列表并返回 列表中的零。(15分(

答:

int count_zeroes(const list<double> &l) {
return count(l.cbegin(), l.cend(), 0);
}

我的问题:

  • 为什么在这里使用cbegin()/cend()而不仅仅是begin()/end()
  • 为什么答案包括通过引用&1传递(也许在问题中指定了这一点(?
  • 为什么list被制作为常量变量?

我得到了类似的答案,但没有常量引用,我改用了按值传递。

为什么答案包括引用 &1 的传递(也许在问题中指定了(?

避免创建整个列表的不必要副本。请记住,目标是只"读取"列表的内容并计算零。这有助于我们回答另一个问题:

为什么列表被制作为常量变量

由于我们只应该"读取"列表的内容,并且通过引用传递意味着对列表的任何更改都将反映在原始列表中。最好将此类变量作为const传递以防止意外更改。

为什么在这里使用 cbegin((/cend(( 而不仅仅是 begin((/end((

刚刚发现,@NathanOliver是对的。为了完整起见,将他的评论粘贴在这里:begin被重载以使const对象返回const_iterator因此无需实际使用cbegin,因为lconst

为什么在这里使用 cbegin((/cend(( 而不是 begin((/end(( ?

内森·奥利弗(NathanOliver(在这一点上纠正了我。在这种情况下,似乎没有特别的理由使用 cbegin 和 cend,因为 const 数据结构将返回 const 迭代器。似乎使用 cbegin、cend 和 begin,end 将产生相同的结果。

为什么答案包括引用"&1"的传递(这是 也许在问题中指定(?

与按值传递相比,通过引用传递潜在的大型数据结构是标准做法和效率,如果您不打算更改它们,那么通过 const 引用传递是正确的做法。

为什么将"列表"作为常量变量?

因为它不会在方法内部更改。使用 const 表示不允许更改某些内容允许编译器应用它无法应用的优化。