为什么在这个C++问题中使用const_iterator而不仅仅是迭代器?
Why is const_iterator used instead of just iterator in this C++ question?
我有一个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
,因为l
是const
。
为什么在这里使用 cbegin((/cend(( 而不是 begin((/end(( ?
内森·奥利弗(NathanOliver(在这一点上纠正了我。在这种情况下,似乎没有特别的理由使用 cbegin 和 cend,因为 const 数据结构将返回 const 迭代器。似乎使用 cbegin、cend 和 begin,end 将产生相同的结果。
为什么答案包括引用"&1"的传递(这是 也许在问题中指定(?
与按值传递相比,通过引用传递潜在的大型数据结构是标准做法和效率,如果您不打算更改它们,那么通过 const 引用传递是正确的做法。
为什么将"列表"作为常量变量?
因为它不会在方法内部更改。使用 const 表示不允许更改某些内容允许编译器应用它无法应用的优化。