cr0*_*0pp 9 c++ c++20 std-ranges
有没有比反转两次更好的方法来使用 c++20 范围删除容器中的最后一个元素?
#include <iostream>
#include <vector>
#include <ranges>
int main()
{
std::vector<int> foo{1, 2, 3, 4, 5, 6};
for (const auto& d: foo | std::ranges::views::reverse
| std::ranges::views::drop(1)
| std::ranges::views::reverse)
{
std::cout << d << std::endl;
}
}
Run Code Online (Sandbox Code Playgroud)
康桓瑋*_*康桓瑋 10
你需要的是views::drop_last
来自p2214且具有第 2 级优先级的文件。
正如报纸所说:
\n\n\n我们\xe2\x80\x99将浏览该系列中其他潜在的范围适配器,并\n讨论如何根据现有适配器来实现它们:
\n\n
\n- \n
take_last(N)
和drop_last(N)
。views::take_last(N)
相当于\nviews::reverse | views::take(N) | views::reverse
。但这有点昂贵,尤其是对于非普遍观点。对于随机访问、大小范围,我们\xe2\x80\x99re 可能想要r | views::take_last(N)
评估为r | views::drop(r.size() - N)
,而这种愿望确实是这个\n整个问题的关键\n整个问题\xe2\x80\x94 是等效版本足够好还是我们应该\想要做对吗?
由于vector
是随机访问,大小范围,你可以这样做
for (const auto& d: foo | std::views::take(foo.size() - 1))\n{\n std::cout << d << std::endl;\n}\n
Run Code Online (Sandbox Code Playgroud)\n
使用怎么样span
?
#include <iostream>
#include <span>
#include <vector>
int main() {
std::vector<int> foo{1, 2, 3, 4, 5, 6};
for (const auto& d : std::span(foo.begin(), foo.end() - 1)) {
std::cout << d << '\n';
}
}
Run Code Online (Sandbox Code Playgroud)