С чаем беда...
Эксперт CЭксперт С++
9975 / 5330 / 1458
Регистрация: 18.10.2014
Сообщений: 12,805
1

Ошибки связанные с итераторами (кэширование размера контейнера)

24.04.2020, 19:33. Показов 378. Ответов 2
Метки нет (Все метки)

Цитата Сообщение от hoggy Посмотреть сообщение
Ошибки связанные с итераторами (кэширование размера контейнера).

Такие ошибки обычно проявляются собственно по прямому назначению итераторов:
в пробегах по циклам.

Рассмотрим примеры:
C++
1
for ( auto i = vec.begin(); i != vec.end(); ++i ) { ... }
C++
1
2
const auto e = vec.end();
for ( auto i = vec.begin(); i != e; ++i ) { ... }
Какой способ работает быстрее?

На самом деле - 2й способ, потому что в первом случае на каждом шаге цикла
каждый раз заново рассчитывается размер контейнера.

Особенно это критично для контейнеров, чей размер долго рассчитывается.
Написана какая-то дикая чушь. Для всех стандартных контейнеров получение итератора end() - мгновенная O(1) операция. Никакого размера при получении такого итератора никогда не рассчитывается и никакой зависимости от "размер долго рассчитывается" там нет.

Цитата Сообщение от hoggy Посмотреть сообщение
В книгах для новичков существует рекомендация:
самостоятельно закэшировать размер в виде константы,
что бы потом не высчитывать его каждый раз заново.

Ошибка новичка здесь: если он попытается закэшировать размер контейнера,
а потом в теле цикла добавит/удалит элемент.
Непонятно вообще, почему речь идет о каком то "кэшировании размера", когда в приведенном коде кэшируется не размер, а итератор на конец контейнера, т.е. фундаментально иная сущность.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.04.2020, 19:33
Ответы с готовыми решениями:

Привязка размера шрифта до размера контейнера
Например, есть контейнер с шириной в процентах. В нем есть текст. Как ПРАВИЛЬНО привязать размер...

Размер шрифта в зависимость от размера контейнера
Доброго времени суток. При увеличение странички за предел контейнера заходит текст,собственно это...

Увеличение размера шрифта с увеличением контейнера
<div class="block"> <div class="stepArticle"> <p class="text">info</p> ...

Как при изменении размера содержимого не менять размер контейнера
Есть меню, при выделении тега а, делаю подчеркивание и увеличиваю шрифт, соответственно...

2
Эксперт С++
8719 / 4262 / 950
Регистрация: 15.11.2014
Сообщений: 9,668
24.04.2020, 20:36 2
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Написана какая-то дикая чушь. Для всех стандартных контейнеров получение итератора end() - мгновенная O(1) операция. Никакого размера при получении такого итератора никогда не рассчитывается и никакой зависимости от "размер долго рассчитывается" там нет.
1.
речь не только о стандартных контейнерах.

это - универсальный дизайн:
C++
1
for ( auto i = vec.begin(), e = vec.end(); i != e; ++i ) { ... }
он подойдёт для любого контейнера для случая,
когда на протяжении всего цикла элементы не будут добавляться/удаляться

нет никаких причин на каждой итерации заново вызывать end()

2.
сложность операции O(1) не означает,
что операция будет выполненна мгновенно.

она вообще никак не характеризует фактическую длительность выполнения операции.

3.
под капотом end() может быть что угодно.
там могут быть какие угодно проверки стоять.

например, в стандартных контейнерах любят всякие assert проверки вставлять.


Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Непонятно вообще, почему речь идет о каком то "кэшировании размера", когда в приведенном коде кэшируется не размер, а итератор на конец контейнера, т.е. фундаментально иная сущность.
может потому, что у тебя не только с чаем беда, но и с мозгами?
0
С чаем беда...
Эксперт CЭксперт С++
9975 / 5330 / 1458
Регистрация: 18.10.2014
Сообщений: 12,805
24.04.2020, 20:40  [ТС] 3
Цитата Сообщение от hoggy Посмотреть сообщение
это - универсальный дизайн:
C++
1
for ( auto i = vec.begin(), e = vec.end(); i != e; ++i ) { ... }
он подойдёт для любого контейнера для случая,
когда на протяжении всего цикла элементы не будут добавляться/удаляться
"Взаимоисключающие параграфы" (с)

Цитата Сообщение от hoggy Посмотреть сообщение
речь не только [...] сложность [...] не означает [...] под капотом [...] может быть что угодно [...] любят всякие assert проверки вставлять.
По-прежнему вместо признания и исправления грубых ошибок - верчение пятой точкой и оскорбления. Однако умилило упоминание "всяких assert" )))

Прогресса не наблюдается.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.04.2020, 20:40
Помогаю со студенческими работами здесь

WPF - изменение программно размера контейнера под загружаемое изображение
Добрый день! Хочу в контейнер загрузить картинку. Но проблема в том, что как задал контейнер,...

Ошибки, связанные с деструктором
Здравствуйте Всем! Вот такой вопрос. Может плохо сформулированный, но не знаю как и взяться за...

Ошибки связанные с api vk
Код: def testpost(): session = vk.AuthSession(app_id='5418092', user_login='mylogin@vk.com',...

Ошибки связанные с wininet
Здравствуйте. Проект выглядит так: #include "stdafx.h" #include <windows.h> #include <stdio.h>...

Кроп элементов ListBox'a при изменении размера контейнера с включенной виртуализацией
Уважаемые форумчане, помогите пожалуйста тупому школьнику новичку в WPF. Вот очень простой...

PCAP и связанные с ним ошибки
Доброго времени суток. Использую PCAP, чтобы снифать пакеты в своей программе. Она работает, однако...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru