Диапазоны идут к C ++ со стандартной версией C ++ 20.
Мой вопрос: сможем ли мы создать (существующие) контейнеры стандартной библиотеки с любым диапазоном? И что еще важнее, с диапазоном просмотров?
Например, будет ли это:
#include <vector>
#include <iostream>
#include <ranges>
int main() {
auto sq = [](int x) { return x * x; };
std::vector<int> vec { 3, 4, 5 };
std::vector<int> squares { std::ranges::views::transform(vec, sq) };
for(auto i : squares) { std::cout << i << ' '; }
std::cout << std::endl;
}
быть действительной программой, которая печатает 9 16 25
?
Это компилируется с библиотеком range-v3 , для чего это стоит.
Ответы:
Нет. Единственный стандартный компонент библиотеки, который может быть сконструирован из произвольного диапазона и соответствует правильным критериям
std::span<T>
.Скорее всего, в этом направлении будет идти стандартная библиотека, к которой также направляется range-v3 (обратите внимание, что связанный пример из range-v3 компилируется, но предупреждает об устаревшем преобразовании) - используя помощника для выполнения преобразований за вас:
Одна из причин не идти в направлении конструкторов диапазона может быть замечена из самого примера, который вы используете:
Посмотрите, насколько эта декларация отличается от этих двух:
v
будет обязательноvector<transform_view<...>>
содержать одинtransform_view
, аw
будетvector<int>
.Более того, добавление в стандартную библиотеку дополнительных, тщательно ограниченных конструкторов контейнеров в любом случае не поможет сторонним типам контейнеров - в то время как подобный объект
ranges::to
работает превосходно во всех случаях.источник
v
иw
выглядят одинаково для меня. Возможно, вы хотели объявитьw
какvector<int>
. В противном случае это правильный ответ.v
и чемw
отличаются? Это как-то связано с тем, как работает вывод аргумента шаблона конструктора?