是否有 c++ std::list 的 lisp cdr 等价物

Is there a lisp cdr equivalence for c++ std::list

有些人的自定义列表 class 带有 car(例如头部)cdr(例如尾部)。我想知道是否可以使用 std::list 来支持这些操作。 car 是微不足道的。但是我不知道cdr如何模拟。

在 C++20 中,我们将获取范围库。我还没有详细研究它,但我怀疑子范围或视图在这里可能会有所帮助。

C++20 前版本

在 C++ 中(到目前为止),我们通常不直接传递列表(或其他容器),而是传递一对迭代器。看看 <algorithm> 库:像 std::sort 这样的函数不引用容器 - 相反,它们采用 first 迭代器和 last 迭代器。

重要提示:last 不是 指向最后一项,而是指向它后面的一个位置 - 与 std::list::end() 给你的一样。这意味着当 first == last 你有 "an empty list"

在 C++20 之前的世界中,您通常会以相同的方式编写代码。这样做的一个好处是,如果你有一对迭代器 firstlast,那么(只要 first != last*first 就是 carstd::next(first)last 对是 cdr。所以:

(defun sum (list)
  (if (null list)
      0
    (+ (car list) (sum (cdr list)))))

变成类似

的东西
template <class ForwardIter>
int sum(ForwardIter first, ForwardIter last) {
  return (first == last)
           ? 0
           : (*first) + sum(std::next(first), last);
}

(我知道有些人不同意我在多行上格式化条件运算符的方式 - 但我想反映 Lisp 风格。)