Существует ли в рамках C++20 класс подобный basic_string_view или span, который можно использовать поверх std::deque ?
Требуются такие операции как:
empty()
size()
remove_front(n)
remove_back(n)
subview(pos, len)
operator[](index)
Здравствуйте, B0FEE664, Вы писали:
BFE>Существует ли в рамках C++20 класс подобный basic_string_view или span, который можно использовать поверх std::deque ? BFE>Требуются такие операции как: BFE>empty() BFE>size() BFE>remove_front(n) BFE>remove_back(n) BFE>subview(pos, len) BFE>operator[](index)
А как ты себе это представляешь? string_view и span абстрагирую контейнер через (T*, size_t), а деку можно абстрагировать только через деку, поэтому вроде как и не надо. Для остального рэнжи подойдут.
Здравствуйте, B0FEE664, Вы писали:
BFE>Существует ли в рамках C++20 класс подобный basic_string_view или span, который можно использовать поверх std::deque ? BFE>Требуются такие операции как: BFE>empty() BFE>size() BFE>remove_front(n) BFE>remove_back(n) BFE>subview(pos, len) BFE>operator[](index)
Если remove_front/remove_back сдвигают рамку, а не удаляют из родительского контейнера, то можно использовать пару итераторов и std::ranges::view_interface (или std::ranges::subrange).
template<typename Iterator>
struct my_view : std::ranges::subrange<Iterator>
{
// begin/(), end(), size(), empty(), operator[],... из базового классаusing base = std::ranges::subrange<Iterator>;
using base::base;
using base::operator =;
// проверки на выход за границы добавлять по вкусу.void remove_front() { *this = my_view( base::begin()+1, base::end() ); }
void remove_back() { *this = my_view( base::begin(), base::end()-1 ); }
my_view subview(size_t pos, size_t len) const { return my_view( base::begin()+pos, base::begin()+pos+len) ; }
};
template<class It>
my_view(It, It) -> my_view<It>;
template<class Container>
my_view(const Container&) -> my_view<typename Container::const_iterator>;
Здравствуйте, Chorkov, Вы писали:
BFE>>Существует ли в рамках C++20 класс подобный basic_string_view или span, который можно использовать поверх std::deque ? BFE>>remove_front(n) BFE>>remove_back(n) C>Если remove_front/remove_back сдвигают рамку, а не удаляют из родительского контейнера,
Имеется ввиду, что это аналоги
std::basic_string_view::remove_prefix
и
std::basic_string_view::remove_suffix
C>то можно использовать пару итераторов и std::ranges::view_interface (или std::ranges::subrange).
Я спросил копилот перед тек как задавать здесь вопрос, он ответил:
2. Альтернатива: использовать std::ranges
С C++20 можно использовать std::ranges::subrange, но он тоже требует contiguous_iterator для некоторых операций. Для deque это ограничено.
Я std::ranges никогда ещё не использовал и поэтому непонятно. ИИ, как обычно, не прав?
BFE>Я спросил копилот перед тек как задавать здесь вопрос, он ответил: BFE>
BFE>2. Альтернатива: использовать std::ranges
BFE>С C++20 можно использовать std::ranges::subrange, но он тоже требует contiguous_iterator для некоторых операций. Для deque это ограничено.
BFE>Я std::ranges никогда ещё не использовал и поэтому непонятно. ИИ, как обычно, не прав?
Как-бы формально прав. Если вы захотите, в дополнение к запрошенным, использовать еще и метод data, то получите ошибку компиляции.
(Это единственный метод, который ставит отдельное требование на тип итератора.)
Если метод data не нужен, то достаточно input_or_output_iterator.
Здравствуйте, andrey.desman, Вы писали:
BFE>>Существует ли в рамках C++20 класс подобный basic_string_view или span, который можно использовать поверх std::deque ? AD>А как ты себе это представляешь?
Как окно, размеры которого можно менять, которое можно двигать и через которое можно смотреть на последовательность.
AD>string_view и span абстрагирую контейнер через (T*, size_t),
Если бы не метод data(), то я не вижу проблем.
AD>а деку можно абстрагировать только через деку, поэтому вроде как и не надо. Для остального рэнжи подойдут.
Допустим, рэнжи. Вариант Chorkov'а правильный?
Посмотрел на std::ranges::subrange
Получается, что метод std::ranges::subrange::next это как раз remove_front(), но вот метода меняющего end_ я, почему-то, не вижу. Странно это.
Здравствуйте, B0FEE664, Вы писали:
BFE>Существует ли в рамках C++20 класс подобный basic_string_view или span, который можно использовать поверх std::deque ? BFE>Требуются такие операции как: BFE>empty() BFE>size() BFE>remove_front(n) BFE>remove_back(n) BFE>subview(pos, len) BFE>operator[](index)
Если я не ошибаюсь, то изначальное предназначение string_view / span — это своего рода контракт для всяких кросс-языковых вызовов, типа передать строку из си++ в си или в другой язык. И это сделано для линейных буферов, где обращение к элементу всегда происходит через базовый указатель + смещение/индекс.
Поэтому для deque не может быть такого view, так же как и для ассоциативных контейнеров.
Грубо говоря, span для deque это
template<typename T>
struct deque_view
{
std::deque<T> data; // сама очередь
size_t begin, end; // индексы первого и последнего элемента
}
Поэтому мне кажется, вам надо чётко поставить вопрос, зачем вам такое понадобилось. Думаю тогда и ответ выйдет тривиальным
Здравствуйте, SaZ, Вы писали:
SaZ>Если я не ошибаюсь, то изначальное предназначение string_view / span — это своего рода контракт для всяких кросс-языковых вызовов, типа передать строку из си++ в си или в другой язык. И это сделано для линейных буферов, где обращение к элементу всегда происходит через базовый указатель + смещение/индекс. SaZ>Поэтому для deque не может быть такого view, так же как и для ассоциативных контейнеров.
Если бы не требование иметь метод data(), то интерфейс применим к любым последовательностям поддерживающим обращение по индексу.
SaZ>Грубо говоря, span для deque это SaZ>
SaZ>template<typename T>
SaZ>struct deque_view
SaZ>{
SaZ> std::deque<T> data; // сама очередь
SaZ> size_t begin, end; // индексы первого и последнего элемента
SaZ>}
SaZ>
Сама очередь здесь излишня.
begin, end должны быть итераторами.
Упоминание deque — излишне.
SaZ>Поэтому мне кажется, вам надо чётко поставить вопрос, зачем вам такое понадобилось. Думаю тогда и ответ выйдет тривиальным
Не знаю, чего тут нечёткого. Мне нужен string_view поверх произвольного контейнера поддерживающего обращение по индексу.