使用 C++20 <ranges> 可以对 <set> 进行单行初始化吗?
Is one-line initialization of a <set> possible with C++20 <ranges>?
我想知道在 C++20 中使用 <ranges>
是否最终可以从一个序列中 select 并在一行中初始化一个 set
,这是可能的在 C# 中使用 IEnumerable
。这可能需要将 <ranges>
对象转换为 std::initializer_list
.
C#:
int[] sequence = new int[] { 0,1,2,3,4 };
HashSet<int> set = new HashSet<int>(sequence.Where((int i) => i % 2 == 0));
C++:
std::vector<int> sequence { 0,1,2,3,4 };
auto matcher = sequence | std::ranges::views::filter([](int i) { return !(i % 2); });
std::set<int> myset(matcher.begin(), matcher.end());
我想做这样的事情:
std::vector<int> sequence { 0,1,2,3,4 };
std::set<int> myset { sequence | std::ranges::views::filter([](int i) { return !(i % 2); }) };
目前暂时还做不到,但在不久的将来,我们可以得到ranges::to,它将具有这样的功能。
我想知道在 C++20 中使用 <ranges>
是否最终可以从一个序列中 select 并在一行中初始化一个 set
,这是可能的在 C# 中使用 IEnumerable
。这可能需要将 <ranges>
对象转换为 std::initializer_list
.
C#:
int[] sequence = new int[] { 0,1,2,3,4 };
HashSet<int> set = new HashSet<int>(sequence.Where((int i) => i % 2 == 0));
C++:
std::vector<int> sequence { 0,1,2,3,4 };
auto matcher = sequence | std::ranges::views::filter([](int i) { return !(i % 2); });
std::set<int> myset(matcher.begin(), matcher.end());
我想做这样的事情:
std::vector<int> sequence { 0,1,2,3,4 };
std::set<int> myset { sequence | std::ranges::views::filter([](int i) { return !(i % 2); }) };
目前暂时还做不到,但在不久的将来,我们可以得到ranges::to,它将具有这样的功能。