代码之家  ›  专栏  ›  技术社区  ›  J Moss

为什么在这个C++问题中使用了StaskIsExter代替了迭代器?

c++
  •  0
  • J Moss  · 技术社区  · 6 年前

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

    问题:

    使用以下库算法:

    • find(b, e, v) 搜索范围 [b, e) 并返回一个迭代器,该迭代器指向 v ,如果有,或者 e 如果没有,

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

    回答:

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

    我的问题是:

    • 为什么 cbegin() / cend() 用在这里而不是 begin() / end() ?
    • 为什么答案中包含了 &1 (这个问题可能有具体说明吗?)?
    • 为什么 list 作为常量变量?

    我得到了一个类似的答案,但是没有常量引用,而是使用pass-by值。

    2 回复  |  直到 6 年前
        1
  •  0
  •   Rich    6 年前

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

    NathanOliver已经纠正了我的错误。在这种情况下,似乎没有使用cbegin和cend的特殊原因,因为const数据结构将返回const迭代器。似乎使用cbegin、cend和begin、end会得到相同的结果。

    为什么答案中包含对“&1”的“pass-by”引用(这是不是 可能是在问题中指定的?

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

    为什么把“list”作为常量变量?

    因为它不会在方法内部被改变。使用const来表示不允许更改的内容允许编译器应用其他情况下无法应用的优化。

        2
  •  1
  •   E.N.D    6 年前

    为什么答案中包含对&1的pass-by引用(可能是在问题中指定的)?

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

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

    因为我们只应该“阅读”列表的内容,通过引用传递意味着对列表的任何更改都将反映回原始列表中。传递这样的变量是一个很好的实践 const 防止非故意的改变。

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

    刚刚发现,“纳撒诺利弗是对的。为了完整起见,在此处粘贴他的评论: begin 已超载 常量 返回的对象 const_iterator 所以没有必要用 cbegin 自从 l 常量 .