如何从 std::chunk_by 返回值中获取单个块?

How to get individual chunks from std::chunk_by return value?

提问人:FalcoGer 提问时间:10/31/2023 更新时间:10/31/2023 访问量:66

问:

我有以下 c++23 代码,它使用 .gcc-13.2

#include <iostream>
#include <ranges>
#include <vector>

auto main() -> int
{
    using std::cout;
    std::vector<int> v{1,2,2,2,1,1,1,2,1};
    auto chunks = v | std::views::chunk_by(std::equal_to{});
    for (auto chunk : chunks)
    {
        cout << "[";
        for (const auto& value : chunk)
        {
            cout << value << ", ";
        }
        cout << "]\n";
    }
    cout << std::flush;
    return 0;
}

哪个打印

[1, ]
[2, 2, 2, ]
[1, 1, 1, ]
[2, ]
[1, ]

不出所料。

但我只想说该列表()中的第二个条目。我该怎么做?[2, 2, 2, ]chunks

我尝试使用 进行索引,但这给了我一个编译器错误,就像 一样。我试过了,但这也无法编译。我可以使用,但这很笨拙,肯定有更好的方法可以做到这一点。operator[]at()chunks.begin() + 1 | std::views::drop(1) | std::views::take(1)

正确的方法是什么?

C++ 标准范围 C++23

评论

2赞 Eljay 10/31/2023
|drop(1)|take(1)我就是这样做的。
1赞 Jarod42 10/31/2023
std::next(chunks.begin(), 1)(至于任何非随机存取迭代器)?
0赞 FalcoGer 10/31/2023
@Jarod42有效
0赞 Remy Lebeau 10/31/2023
@Jarod42使用 1 时,第 2 个参数是可选的:std::next(chunks.begin())

答:

5赞 Jarod42 10/31/2023 #1

我试过了chunks.begin() + 1

这仅适用于随机访问迭代器, 您必须改用 (or )。std::next(chunks.begin(), 1)std::next(chunks.begin())