Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.95/19: Рейтинг темы: голосов - 19, средняя оценка - 4.95
5 / 5 / 1
Регистрация: 15.12.2015
Сообщений: 51

Почему итераторы в STL используют такой странный подход к индексации?

20.08.2019, 17:00. Показов 4577. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Вопросы касаются пока только последовательных контейнеров.

Почему при инициализации контейнера массивом из, например, 5 элементов, мы прибавляем к адресу массива во втором аргументе не 4, а 5? В первом аргументе содержится адрес первого элемента, сдвинулись 4 раза = получили все остальные, включая последний. Зачем делать ещё один лишний сдвиг и заходить за диапазон? Это касается и метода контейнера .end(), который возвращает значение итератора "последний элемент + 1".
1
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.08.2019, 17:00
Ответы с готовыми решениями:

Почему создатели языка C++ придумали такой странный синтаксис обращения к элементам одномерного массива?
К элементам массива можно обращаться разными способами. Обычно в квадратных скобках пишут номер элемента массива, а тут узнал что так же...

Вывод календаря на заданый месяц. Не могу понять почему вывод странный такой
Суть в том, что никак не считает правильно пробелы в первой неделе. Постоянно бред какой-то получается. При любом месяце. Задавал уже...

STL. Итераторы и последовательные контейнеры
Немогу решить эти задачки: 1 Написать экземпляр класса queue на основе элементов типа string. 2.Написаты программу, которая использует...

23
 Аватар для Новичок
1682 / 1098 / 489
Регистрация: 17.07.2012
Сообщений: 5,361
21.08.2019, 10:45
Лучший ответ Сообщение было отмечено Марауль как решение

Решение

Студворк — интернет-сервис помощи студентам
Марауль, это же удобно. Допустим хотим взять и первые n чисел отсортировать.
std::sort(a.begin(), a.begin() + n);
удобнее чем
std::sort(a.begin(), a.begin() + n - 1);
Или например хотим отсортировать первую половину массива, а вторую не трогать.
std::sort(a.begin(), a.begin() + a.size() / 2); // и опять -1 не надо писать
Если привыкнуть к полуинтервалам, то это очень удобная штука.
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
21.08.2019, 11:16
Цитата Сообщение от Новичок Посмотреть сообщение
удобнее чем
std::sort(a.begin(), a.begin() + n - 1);
Для алгоритма, который понимает, что задано начало и количество нет вопросов с std::sort(a.begin(), n );
Это просто проще. Когда новичков (простите за тавтологию Новичок), учат передавать указатель на первый элемент массива и количество элементов, это именно оно. Функции не нужно знать истинного размера. У неё другая задача. Поэтому может и вылететь, конечно. Но если бы итератор имел размер (разделяемое данное) и свою текущую позицию - поле экземпляра, то не было бы вопросов ни к чему. Кроме действий юзера, конечно.
Но потери валидности итераторов можно было бы избежать в ряде случаев. То есть есть за что платить.

Добавлено через 8 минут
Цитата Сообщение от Undisputed Посмотреть сообщение
Было бы лучше дать выбор пользователю как например в векторе при доступе к элементам.
Хочешь быстро но с риском словить UB? Используй оператор [], иначе более безопасный но медленный at.
Undisputed, размер библиотечного файла vector больше от того что в нём присутствуют 2 варианта. Это потому, что ни чего не бывает бесплатно. Вопрос всегда в том, как оптимизировать цену, а это вопрос компромисса. Набор условий задачи против набора: ум, честь и совесть того кто решает задачу, плюс его величество случай. Вот и всё что определяет цену. На базаре всегда два дурака. Но задачи бывают и умные.
0
5 / 5 / 1
Регистрация: 15.12.2015
Сообщений: 51
21.08.2019, 13:12  [ТС]
Ничего себе, какую крутую вы тут беседу развели! Жаль, что я пока ещё не всё понимаю)
TRam_, TheCalligrapher, Новичок, спасибо большое вам за разъяснения!! Вот стоило ведь мне догадаться о том, что такой подход прост и прекрасен, но я не догадался. Зато теперь я понимаю ещё одну вещь: если что-то кажется странным, то нужно просто посмотреть на это с другой стороны, расширить свой взгляд.
IGPIGP, спасибо за ваш ответ с философской ноткой! Мне сейчас пока не всё понятно, но я возьму сказанное Вами на заметку.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
21.08.2019, 14:25
Цитата Сообщение от Марауль Посмотреть сообщение
IGPIGP, спасибо за ваш ответ с философской ноткой! Мне сейчас пока не всё понятно, но я возьму сказанное Вами на заметку.
Мы даже до середины не дошли. Марауль, есть простая истина: обобщение необобщаемого это боль. Если говорить о контейнерах STL то некоторые обобщения противоестественны. Структуры произвольного и последовательного доступа сортируются по разному, например. Поиск в бинарных деревьях поиска (BST:set/map) идёт иначе чем в векторах или списках, хотя для упорядоченных векторов есть бинарные алгоритмы верхней/нижней границы... Но различия идут глубже. BST - контейнеры с не детерминированной структурой. То есть, на одном и том же наборе элементов взаимо размещение нодов (топология) зависит от порядка поступления данных. В числе следствий - тот простой факт, что описание положения нода в дереве - не тривиальная задача. Там много различий с такими зверями как вектор или список. Например, когда поиск в BST не удачен, то это значит мы достигли листа в какой-то ветке. То есть у дерева много хвостов, - это такой себе змей Горыныч наоборот. Но создатели библиотеки делают подстановку итератора на следующий за последним (по предикату) элементом. Таким образом, последовательное прохождение для всех контейнеров внешне вполне обобщаемо. Но это кажущееся благополучие.
Цитата Сообщение от Марауль Посмотреть сообщение
Жаль, что я пока ещё не всё понимаю)
Главное, что вы можете задать глубокий вопрос. Остальное, - вопрос вашего упорства, времени и возможности его тратить на удивительный мир С++. Удачи)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.08.2019, 14:25

Итераторы потокового ввода/вывода stl
Возник такой вопрос при изучении stl. Берем файл, из которого нужно считать данные, через copy записываем в вектор, но может мне кто-нибудь...

STL. Не работает вывод через << в поток когда использую итераторы :(
Вроде бы ничего сложного, но почему-то работать не хочет. Никак не могу понять почему ( Ругается, когда пишу void main() { ...

Найти элемент в контейнере priority_queue, используя STL вские итераторы и алгоритмы
Здравствуйте, задача описана в навание темы. Можно перебрать в цикле все элементы очереди, сравнивая с нужным, но требуется именно с...

Можно ли использовать такой подход в классах?
Подскажите пожалуйста. Можно ли в конструкторе класса В, создавать объект другого класса А и потом обращаться к к методам A в классе...


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

Или воспользуйтесь поиском по форуму:
24
Ответ Создать тему
Новые блоги и статьи
Знаете, от чего появляется стресс?
kumehtar 15.07.2026
Стресс появляется оттого, что вы, зная как поступить правильно, делаете наоборот. Ларри Уингет
Нас бьют, а мы крепчаем? Какая чушь!
kumehtar 15.07.2026
Вот это вот бытующее мнение, что человек меняется только под действием проблем, всегда считал вредоносным. Поверь, от проблем у людей появляются не изменения, а нервное расстройство и ПТСР. А. . .
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru