是否有 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 之前的世界中,您通常会以相同的方式编写代码。这样做的一个好处是,如果你有一对迭代器 first
和 last
,那么(只要 first != last
)*first
就是 car
,std::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 风格。)
有些人的自定义列表 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 之前的世界中,您通常会以相同的方式编写代码。这样做的一个好处是,如果你有一对迭代器 first
和 last
,那么(只要 first != last
)*first
就是 car
,std::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 风格。)