view поверх deque
От: B0FEE664  
Дата: 06.08.25 08:52
Оценка:
Существует ли в рамках C++20 класс подобный basic_string_view или span, который можно использовать поверх std::deque ?
Требуются такие операции как:
empty()
size()
remove_front(n)
remove_back(n)
subview(pos, len)
operator[](index)
И каждый день — без права на ошибку...
Re: view поверх deque
От: andrey.desman  
Дата: 06.08.25 08:56
Оценка:
Здравствуйте, 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), а деку можно абстрагировать только через деку, поэтому вроде как и не надо. Для остального рэнжи подойдут.
Отредактировано 06.08.2025 8:57 andrey.desman . Предыдущая версия .
Re: view поверх deque
От: Chorkov Россия  
Дата: 06.08.25 09:56
Оценка: 1 (1)
Здравствуйте, 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>;
Re[2]: view поверх deque
От: B0FEE664  
Дата: 06.08.25 11:33
Оценка:
Здравствуйте, 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 никогда ещё не использовал и поэтому непонятно. ИИ, как обычно, не прав?
И каждый день — без права на ошибку...
Re[3]: view поверх deque
От: Chorkov Россия  
Дата: 06.08.25 11:50
Оценка: +1
Здравствуйте, B0FEE664, Вы писали:


BFE>Я спросил копилот перед тек как задавать здесь вопрос, он ответил:

BFE>

BFE>2. Альтернатива: использовать std::ranges
BFE>С C++20 можно использовать std::ranges::subrange, но он тоже требует contiguous_iterator для некоторых операций. Для deque это ограничено.

BFE>Я std::ranges никогда ещё не использовал и поэтому непонятно. ИИ, как обычно, не прав?

Как-бы формально прав. Если вы захотите, в дополнение к запрошенным, использовать еще и метод data, то получите ошибку компиляции.
(Это единственный метод, который ставит отдельное требование на тип итератора.)

Если метод data не нужен, то достаточно input_or_output_iterator.
Re[2]: view поверх deque
От: B0FEE664  
Дата: 06.08.25 11:50
Оценка:
Здравствуйте, andrey.desman, Вы писали:

BFE>>Существует ли в рамках C++20 класс подобный basic_string_view или span, который можно использовать поверх std::deque ?

AD>А как ты себе это представляешь?
Как окно, размеры которого можно менять, которое можно двигать и через которое можно смотреть на последовательность.

AD>string_view и span абстрагирую контейнер через (T*, size_t),

Если бы не метод data(), то я не вижу проблем.

AD>а деку можно абстрагировать только через деку, поэтому вроде как и не надо. Для остального рэнжи подойдут.

Допустим, рэнжи. Вариант Chorkov'а правильный?
И каждый день — без права на ошибку...
Re[2]: view поверх deque
От: B0FEE664  
Дата: 06.08.25 12:19
Оценка:
Здравствуйте, Chorkov, Вы писали:

C>
C>template<typename Iterator>
C>struct my_view : std::ranges::subrange<Iterator>
C>{
C>    void remove_front() { *this = my_view( base::begin()+1, base::end() ); } 
C>};
C>


Посмотрел на std::ranges::subrange
Получается, что метод std::ranges::subrange::next это как раз remove_front(), но вот метода меняющего end_ я, почему-то, не вижу. Странно это.
И каждый день — без права на ошибку...
Re: view поверх deque
От: SaZ  
Дата: 11.08.25 11:20
Оценка:
Здравствуйте, 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;  // индексы первого и последнего элемента
}


Поэтому мне кажется, вам надо чётко поставить вопрос, зачем вам такое понадобилось. Думаю тогда и ответ выйдет тривиальным
Re[2]: view поверх deque
От: B0FEE664  
Дата: 12.08.25 14:31
Оценка:
Здравствуйте, 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 поверх произвольного контейнера поддерживающего обращение по индексу.
И каждый день — без права на ошибку...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.