Size: a a a

2020 May 28

AT

Anatoly Tomilov in pro.cxx
Александр Караев
просто сконвертировать результат find в const_iterator и всё
это непросто
источник

АК

Александр Караев... in pro.cxx
Anatoly Tomilov
это непросто
это просто, но не очень красиво
источник

AT

Anatoly Tomilov in pro.cxx
ладно. Это за O(1), но для понимания не является простым
источник

АК

Александр Караев... in pro.cxx
Александр Караев
а вообще, std::ranges::copy поддерживает разный тип для begin/end
ну тогда вот - https://godbolt.org/z/EM_jdw
источник

AT

Anatoly Tomilov in pro.cxx
я первый раз вижу ranges (и пока это так в общем не только для меня). Их вряд ли пока будут использовать в продовом коде (пока не приглядятся и не привыкнут)
источник

АК

Александр Караев... in pro.cxx
Anatoly Tomilov
я первый раз вижу ranges (и пока это так в общем не только для меня). Их вряд ли пока будут использовать в продовом коде (пока не приглядятся и не привыкнут)
ranges - уже в C++20
cfind - возможно в C++23, если кто-нибудь напишет пропозал и его примут

выбор очевиден
источник

m

magras in pro.cxx
Anatoly Tomilov
это непросто
Можно скастить сам контейнер к const. Тоже не слишком красиво, но имхо, лучше чем вводить cfind.
источник

AT

Anatoly Tomilov in pro.cxx
да ну прям. cbegin/crbegin/cend/crend ввели же
источник

E

Eugene in pro.cxx
1. Ищем find-ом обычный итератор
2. Сохраняем расстояние от него до начала контейнера.
3. Берём cbegin
4. Двигаем его на это расстояние.

Подход не лучший, конечно, но щито поделать
источник

E

Eugene in pro.cxx
Я бы ввел в язык какой-нибудь std::iterator_cast<>
источник

AT

Anatoly Tomilov in pro.cxx
Eugene
1. Ищем find-ом обычный итератор
2. Сохраняем расстояние от него до начала контейнера.
3. Берём cbegin
4. Двигаем его на это расстояние.

Подход не лучший, конечно, но щито поделать
общий подход за O(1), а не за линейное время для контейнеров с ForwardIterator-ами — это через erase пустого диапазона
источник

АК

Александр Караев... in pro.cxx
Anatoly Tomilov
да ну прям. cbegin/crbegin/cend/crend ввели же
кстати да, std::as_const(m).find(key)
источник

m

magras in pro.cxx
Если следовать этой логике, все методы возвращающие итераторы должны иметь константную версию. Мне кажется это излишним, так как нужно редко и вполне решается обычными кастами.
источник

m

magras in pro.cxx
Anatoly Tomilov
да ну прям. cbegin/crbegin/cend/crend ввели же
Это был ответ сюда.
источник

AT

Anatoly Tomilov in pro.cxx
Александр Караев
кстати да, std::as_const(m).find(key)
вариант с cfind на 14 символов короче был бы)
источник

АК

Александр Караев... in pro.cxx
Eugene
1. Ищем find-ом обычный итератор
2. Сохраняем расстояние от него до начала контейнера.
3. Берём cbegin
4. Двигаем его на это расстояние.

Подход не лучший, конечно, но щито поделать
что за извращение? const_iterator неявно конструируется от обычного
источник

AT

Anatoly Tomilov in pro.cxx
а ну да. Мне const_iterator нужен был. Уже запутался
источник

АК

Александр Караев... in pro.cxx
Anatoly Tomilov
вариант с cfind на 14 символов короче был бы)
лично я считаю, что с приходом as_const и ranges всех cbegin/cend и прочих нужно депрекейтнуть, ибо лишнее размазывание.
много букв - не аргумент в C++
источник

AT

Anatoly Tomilov in pro.cxx
много букв - не аргумент в C++
буду терперть.
источник

АК

Александр Караев... in pro.cxx
Anatoly Tomilov
много букв - не аргумент в C++
буду терперть.
std:: - это целых 5 символов, которые на каждой строке встречаются в среднем 1-2 раза, но живём как-то
источник