170 похожих чатов

Пишу свой итератор, дошел до метода erase не смог загуглить,

почему требуется принимать const_iterator а возвращать должны просто iterator в чем смысл?
почему нельзя было сделать параметр шаблонным мол пришел revers_iterator удалили и вернули следующий за ним такой же revers_iterator ну и так далее для всех возможных вариантов...

16 ответов

32 просмотра

1. supapro 2. в стандарте не написано что там должно приниматься 3. у итератора не может быть метода erase

Stas-Koynov Автор вопроса
Kelbon
1. supapro 2. в стандарте не написано что там долж...

3. ну вы блин серьезно. ясный пень что есть контейнер.

Stas-Koynov Автор вопроса
Kelbon
а пишешь ты итератор

да. и написав метод erase для контейнера, получаю что мы не можем из конст_итератор который был на входе вернуть просто итератор ибо ошибка. и собственно вопрос, почему везде в STL: iterator erase(const_iterator pos)

Stas Koynov
да. и написав метод erase для контейнера, получаю ...

А что не так? iterator может быть сконвертирован в const-версию

Stas-Koynov Автор вопроса
Dmitriy [Отпуск]
А что не так? iterator может быть сконвертирован ...

да, но нам то внутри функции нужно в обратную из const_iterator to iterator. октрыв исходники либы я вижу что внутри метода юзают закрытый метод _M_const_cast(). поэтому и возник вопрос, зачем мы сами рушим требования константности. когда в iterator to const_iterator ок. но в обратную сторону...

Stas Koynov
да, но нам то внутри функции нужно в обратную из c...

Формально говоря, константность итератора не обязана значить таковую для контейнера, так что иначе никак

Stas-Koynov Автор вопроса
Dmitriy [Отпуск]
Формально говоря, константность итератора не обяза...

да это понятно. я про другое. зачем было так делать в STL. причина историческая или есть нечто что я не понимаю. мы же могли просто написать: template <typename Iter> Iter erase(Iter pos) noexcept { destroy(pos); return ++pos; } Но методы для вектора, листа и т.п принимают конст_итератор и возвращают просто итератор.

Stas Koynov
да, но нам то внутри функции нужно в обратную из c...

Есть и такое: delete (const char*)str; Я тоже вижу некоторое нарушение логики, но оно имеет смысл.

Stas-Koynov Автор вопроса
magras
Есть и такое: delete (const char*)str; Я тоже вижу...

да смысл то что будет работать я не спорю. ясный пень что и тот и другой итератор указывают на одну и туже позицию константный он или нет.

Stas-Koynov Автор вопроса
Dmitriy [Отпуск]
И куча шаблонных трейтов как минимум

тоесть для сокращения кода? хорошо где об этом можно почитать?

Stas Koynov
тоесть для сокращения кода? хорошо где об этом мож...

Боюсь, моё мнение тут скорее на уровне обывателя, чем разработчика Стандарта Можно спросить у @antoshkka Суть вопроса: почему erase в контейнерах принимают const_iterator и затем кастят const_cast'ом вместо, например, шаблонного Iter?

Dmitriy [Отпуск]
Боюсь, моё мнение тут скорее на уровне обывателя, ...

неконстантный должен уметь неявно преобразоввываться к константному А перегрузку не делают, чтобы меньше инстанцировалось шаблонов, и соответственно: * компилировалось быстрее * бинарники были меньшего размера

Stas-Koynov Автор вопроса
🐙 Antony Polukhin
неконстантный должен уметь неявно преобразоввывать...

да из iterator to const_iterator это понятно. меня смутило из const в обычный. теперь понятно что для уменьшения кода, (хотя там кода 3 строки), и из-за этого как я понимаю erase не умеет в revers_iterator. наверное у себя напишу тупо через шаблонный параметр.

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта