![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Dray |
|
|||
![]() Материалист ![]() ![]() Профиль Группа: Участник Сообщений: 652 Регистрация: 7.10.2003 Где: г. Всеволожск Репутация: 2 Всего: 6 |
В стандартных контейнерах в каких задачах предпочтительнее пользоваться итераторами, а в каких оператором [] или at()'ом? Что работает быстрее всех? И если в каком-то случае одинаково логично использовать итератор и оператор [] что лучше выбрать?
|
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
at делает проверку на выход за границы массива
[] - нет at медленнее, но безопаснее... -------------------- qqq |
|||
|
||||
| Dray |
|
|||
![]() Материалист ![]() ![]() Профиль Группа: Участник Сообщений: 652 Регистрация: 7.10.2003 Где: г. Всеволожск Репутация: 2 Всего: 6 |
Да, совсем недавно с этим столкнулся. Использовал сначала [] программа вытворяла что хотела, причем явной ошибки небыло, никаких exception'ов не вылетало. Но зато чертовщина творилась, чуть ли не жанглирование кнопками на форме. Думал с ума сойду когда ошибку искал. Поменял некоторые [] на at'ы, тут же схватил исключение, оказалось выход за пределы границы . А что насчет скорости и безопасности итераторов по сравнению с []? |
|||
|
||||
| SaDFromSpb |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 263 Регистрация: 5.4.2006 Где: Санкт-Петербург Репутация: 3 Всего: 3 |
Оператор [] работает так же, как и с обычными массивами. То есть берет адресс первого элемента контейнера и прибавляет число в скобках, получая адресс нужного элемента. И никаких проверок во имя скорости. Все элементы контейнера, который поддерживает оператор [], располагаются в памяти непрерывно - это требование стандарта, как мне тут умные люди подсказали.
Следовательно по скорости самое быстрое - это оператор []. Что из возможных средств доступа к элементу выбрать, зависит от случая. Если требуется пройтись по всем элементам в прямом или обратном порядке, то быстрее воспользоваться итератором, наверное; или вообще использовать for_each(). Это сообщение отредактировал(а) SaDFromSpb - 11.6.2006, 19:30 -------------------- "За исключением части, касающейся потоков, библиотека Loki написана на стандартном языке С++. Увы, это означает, что многие современные компиляторы не смогут работать с ней в полном объеме." (А. Александреску. Modern C++ design. 2001) |
|||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
Dray, Во первых не во всех контейнерах STL есть operator[] или at(). Тогда выбора просто не остается. Что касается контейнеров, которые располагают свои элементы последовательно( vector, stack и т.д. ), то в релизной версии,практически всегда, итератор == указатель на элемент, что есть хорошо. Практически оптимальный вариант. При грамотном использовании итераторы вполне безопасны с точки зрения исключений. Но надо всегда иметь ввиду, что после многих "изменяющих последовательность" операций, итератор становится недействительным.
|
|||
|
||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
map -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
| DeadSoul |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1217 Регистрация: 25.9.2005 Где: Москва Репутация: 2 Всего: 11 |
Это проблема не операторов, а твоя Никак. В релизе практически никак. В дебаге получишь ассерты. Например, для вектора в релизе итераторы практически всегда - обычне указатели В точку. -------------------- Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". Бьем спамеров их же оружием. Пусть весь спам сыпется им [email protected] |
|||
|
||||
| SaDFromSpb |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 263 Регистрация: 5.4.2006 Где: Санкт-Петербург Репутация: 3 Всего: 3 |
DeadSoul, Void,
А блин! Забыл про map забыл... -------------------- "За исключением части, касающейся потоков, библиотека Loki написана на стандартном языке С++. Увы, это означает, что многие современные компиляторы не смогут работать с ней в полном объеме." (А. Александреску. Modern C++ design. 2001) |
|||
|
||||
| ZeusAtVingrad |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 82 Регистрация: 12.4.2006 Репутация: нет Всего: нет |
А зачем stack'у располагать элементы последовательно? Это сообщение отредактировал(а) ZeusAtVingrad - 11.6.2006, 23:49 |
|||
|
||||
| DeadSoul |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1217 Регистрация: 25.9.2005 Где: Москва Репутация: 2 Всего: 11 |
А стек - не есть контейнер, это контейнерный адаптер(и как оно называется) -------------------- Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". Бьем спамеров их же оружием. Пусть весь спам сыпется им [email protected] |
|||
|
||||
| ZeusAtVingrad |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 82 Регистрация: 12.4.2006 Репутация: нет Всего: нет |
Э-э, и что?
Я про саму структуру данных "стек" говорю: для её функциональности последовательное размещение данных в памяти не обязательно. |
|||
|
||||
| np9mi7 |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 553 Регистрация: 17.8.2003 Где: Volgograd, Russia Репутация: 5 Всего: 10 |
at с исключением, [] как правило с assert - ом... Просто часто [] инкапсулирует в себе дополнительные действия (например поиск в map и ему подобных).
Поэтому вот что-то типа этого:
Можно заменить стандартным алгоритмом с использованием итераторов:
|
||||
|
|||||
| DeadSoul |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1217 Регистрация: 25.9.2005 Где: Москва Репутация: 2 Всего: 11 |
np9mi7, а в чем смысл твоего примера?
Добавлено @ 11:00
А это не обязательно вектор
(с)С++ Стандарт -------------------- Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". Бьем спамеров их же оружием. Пусть весь спам сыпется им [email protected] |
||||
|
|||||
| np9mi7 |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 553 Регистрация: 17.8.2003 Где: Volgograd, Russia Репутация: 5 Всего: 10 |
Это сообщение отредактировал(а) np9mi7 - 12.6.2006, 13:46 |
||||||||
|
|||||||||
| ZeusAtVingrad |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 82 Регистрация: 12.4.2006 Репутация: нет Всего: нет |
Что-то всё-равно не пойму куда ты разговор уводишь, ну да ладно, проехали. |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |