5 / 5 / 1
Регистрация: 15.12.2015
Сообщений: 51
1

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

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

Здравствуйте. Вопросы касаются пока только последовательных контейнеров.

Почему при инициализации контейнера массивом из, например, 5 элементов, мы прибавляем к адресу массива во втором аргументе не 4, а 5? В первом аргументе содержится адрес первого элемента, сдвинулись 4 раза = получили все остальные, включая последний. Зачем делать ещё один лишний сдвиг и заходить за диапазон? Это касается и метода контейнера .end(), который возвращает значение итератора "последний элемент + 1".
1

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.08.2019, 17:00
Ответы с готовыми решениями:

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

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

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

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

23
Модератор
1638 / 1092 / 487
Регистрация: 17.07.2012
Сообщений: 5,344
21.08.2019, 10:45 21
Лучший ответ Сообщение было отмечено Марауль как решение

Решение

Марауль, это же удобно. Допустим хотим взять и первые 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
Комп_Оратор)
Эксперт по математике/физике
8719 / 4426 / 598
Регистрация: 04.12.2011
Сообщений: 13,262
Записей в блоге: 16
21.08.2019, 11:16 22
Цитата Сообщение от Новичок Посмотреть сообщение
удобнее чем
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  [ТС] 23
Ничего себе, какую крутую вы тут беседу развели! Жаль, что я пока ещё не всё понимаю)
TRam_, TheCalligrapher, Новичок, спасибо большое вам за разъяснения!! Вот стоило ведь мне догадаться о том, что такой подход прост и прекрасен, но я не догадался. Зато теперь я понимаю ещё одну вещь: если что-то кажется странным, то нужно просто посмотреть на это с другой стороны, расширить свой взгляд.
IGPIGP, спасибо за ваш ответ с философской ноткой! Мне сейчас пока не всё понятно, но я возьму сказанное Вами на заметку.
0
Комп_Оратор)
Эксперт по математике/физике
8719 / 4426 / 598
Регистрация: 04.12.2011
Сообщений: 13,262
Записей в блоге: 16
21.08.2019, 14:25 24
Цитата Сообщение от Марауль Посмотреть сообщение
IGPIGP, спасибо за ваш ответ с философской ноткой! Мне сейчас пока не всё понятно, но я возьму сказанное Вами на заметку.
Мы даже до середины не дошли. Марауль, есть простая истина: обобщение необобщаемого это боль. Если говорить о контейнерах STL то некоторые обобщения противоестественны. Структуры произвольного и последовательного доступа сортируются по разному, например. Поиск в бинарных деревьях поиска (BST:set/map) идёт иначе чем в векторах или списках, хотя для упорядоченных векторов есть бинарные алгоритмы верхней/нижней границы... Но различия идут глубже. BST - контейнеры с не детерминированной структурой. То есть, на одном и том же наборе элементов взаимо размещение нодов (топология) зависит от порядка поступления данных. В числе следствий - тот простой факт, что описание положения нода в дереве - не тривиальная задача. Там много различий с такими зверями как вектор или список. Например, когда поиск в BST не удачен, то это значит мы достигли листа в какой-то ветке. То есть у дерева много хвостов, - это такой себе змей Горыныч наоборот. Но создатели библиотеки делают подстановку итератора на следующий за последним (по предикату) элементом. Таким образом, последовательное прохождение для всех контейнеров внешне вполне обобщаемо. Но это кажущееся благополучие.
Цитата Сообщение от Марауль Посмотреть сообщение
Жаль, что я пока ещё не всё понимаю)
Главное, что вы можете задать глубокий вопрос. Остальное, - вопрос вашего упорства, времени и возможности его тратить на удивительный мир С++. Удачи)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.08.2019, 14:25

Помощь в написании контрольных, курсовых и дипломных работ здесь.

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

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.