使用 c++20 范围删除最后一个元素的最佳方法是什么

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
  • take_last(N)drop_last(N)views::take_last(N)相当于\n views::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 是等效版本足够好还是我们应该\想要做对吗?
  • \n
\n
\n

由于vector是随机访问,大小范围,你可以这样做

\n
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


Ayx*_*xan 7

使用怎么样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)

  • 你可以这样拼写:`std::span(foo).first(foo.size() - 1)` (2认同)