- ranges[meta header]
- std::ranges[meta namespace]
- class template[meta id-type]
- cpp23[meta cpp]
namespace std::ranges {
template<view V>
requires input_range<V>
class chunk_view : public view_interface<chunk_view<V>> {…… }; // (1)
namespace views {
inline constexpr /*unspecified*/ chunk = /*unspecified*/; // (2)
}
}
chunk_view
はRangeを指定個数ごとに分割したview
のRange。
元となるRangeの要素数が指定個数で割り切れない場合、最後のview
は余った要素のみを持ち、その要素数は指定個数よりも少なくなる。
- (1):
chunk_view
のクラス定義
- (2):
chunk_view
を生成するカスタマイゼーションポイントオブジェクト
外側Range
borrowed |
sized |
output |
input |
forward |
bidirectional |
random_access |
contiguous |
common |
viewable |
view |
|
※ |
〇 |
〇 |
※ |
※ |
※ |
|
※ |
○ |
○ |
内側Range
borrowed |
sized |
output |
input |
forward |
bidirectional |
random_access |
contiguous |
common |
viewable |
view |
|
※ |
〇 |
〇 |
※ |
※ |
※ |
※ |
※ |
○ |
○ |
- (2): 式
views::chunk(E, N)
の効果はchunk_view(E, N)
と等しい。
#include <ranges>
#include <vector>
#include <print>
int main() {
std::vector v = {1, 2, 3, 4, 5, 6};
std::println("{}", v | std::views::chunk(1));
std::println("{}", v | std::views::chunk(3));
std::println("{}", v | std::views::chunk(5));
std::println("{}", v | std::views::chunk(7));
}
- std::views::chunk[color ff0000]
[[1], [2], [3], [4], [5], [6]]
[[1, 2, 3], [4, 5, 6]]
[[1, 2, 3, 4, 5], [6]]
[[1, 2, 3, 4, 5, 6]]
#include <ranges>
#include <vector>
#include <string>
#include <sstream>
#include <print>
int main() {
// cin代わりの文字列ストリーム
std::istringstream iss(R"(
2 10
31 41 59 26 53 58 97 93 23 84
62 64 33 83 27 95 2 88 41 97
)");
int h, w;
iss >> h >> w;
const auto table = std::views::istream<int>(iss)
| std::views::chunk(w)
| std::views::take(h)
| std::ranges::to<std::vector<std::vector<int>>();
std::println("{}", table);
}
- std::views::chunk[color ff0000]
- std::views::take[link take_view.md]
- std::ranges::to[link to.md]
[[31, 41, 59, 26, 53, 58, 97, 93, 23, 84], [62, 64, 33, 83, 27, 95, 2, 88, 41, 97]]