- ranges[meta header]
- std::ranges[meta namespace]
- class template[meta id-type]
- cpp26[meta cpp]
namespace std::ranges {
template<input_range V>
requires view<V>
class to_input_view : public view_interface<to_input_view<V>> { …… }; // (1)
namespace views {
inline constexpr /*unspecified*/ to_input = /*unspecified*/; // (2)
}
}
このviewは、Rangeをinput_rangeに変換し、非common_rangeにする (イテレータと番兵の型を別にする)。
このviewは、パフォーマンス向上のために使用する。以下に例示する:
| borrowed |
sized |
output |
input |
forward |
bidirectional |
random_access |
contiguous |
common |
viewable |
view |
| ※ |
※ |
|
○ |
|
|
|
※ |
|
○ |
○ |
- (2): 式
views::to_input(E)の効果は次のいずれか(T = decltype((E))、U = remove_cvref_t<T>とする)
#include <ranges>
#include <iostream>
#include <vector>
int main() {
std::vector<int> v = {1, 2, 3, 4};
for (auto i : v | std::views::to_input) {
std::cout << i << ' ';
}
}
- views::to_input[color ff0000]
#include <ranges>
#include <iostream>
#include <vector>
int main() {
std::vector<std::vector<int>> v1 = {{1, 2}, {3, 4}};
// `v1 | std::views::join`と比較して、イテレータと番兵の比較コストが低くなり、
// パフォーマンスが向上する
for (auto i : v1 | std::views::to_input | std::views::join) {
std::cout << i << ' ';
}
// `v2 | std::views::chunk(3)`と比較して、各要素が1回ずつイテレートで済むため、
// パフォーマンスが向上する
std::vector v2 = {1, 2, 3, 4, 5, 6};
for (const auto& v : v2 | std::views::to_input | std::views::chunk(3)) {
for (const auto& i : v) {
std::cout << i << ' ';
}
std::cout << std::endl;
}
}
- views::to_input[color ff0000]
- std::views::join[link join_view.md]
- std::views::chunk[link chunk_view.md]
- Clang: 21 [mark verified]
- GCC: 15.1 [mark verified]
- Visual C++: 2022 Update 14 [mark noimpl]