5 / 5 / 1
Регистрация: 15.12.2015
Сообщений: 51
|
|
1 | |
Почему итераторы в STL используют такой странный подход к индексации?20.08.2019, 17:00. Показов 3688. Ответов 23
Метки нет (Все метки)
Здравствуйте. Вопросы касаются пока только последовательных контейнеров.
Почему при инициализации контейнера массивом из, например, 5 элементов, мы прибавляем к адресу массива во втором аргументе не 4, а 5? В первом аргументе содержится адрес первого элемента, сдвинулись 4 раза = получили все остальные, включая последний. Зачем делать ещё один лишний сдвиг и заходить за диапазон? Это касается и метода контейнера .end(), который возвращает значение итератора "последний элемент + 1".
1
|
20.08.2019, 17:00 | |
Ответы с готовыми решениями:
23
Почему создатели языка C++ придумали такой странный синтаксис обращения к элементам одномерного массива? Вывод календаря на заданый месяц. Не могу понять почему вывод странный такой STL. Итераторы и последовательные контейнеры Итераторы потокового ввода/вывода stl |
1642 / 1091 / 487
Регистрация: 17.07.2012
Сообщений: 5,345
|
|
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
|
Комп_Оратор)
|
|
21.08.2019, 11:16 | 22 |
Для алгоритма, который понимает, что задано начало и количество нет вопросов с
std::sort(a.begin(), n ); Это просто проще. Когда новичков (простите за тавтологию Новичок), учат передавать указатель на первый элемент массива и количество элементов, это именно оно. Функции не нужно знать истинного размера. У неё другая задача. Поэтому может и вылететь, конечно. Но если бы итератор имел размер (разделяемое данное) и свою текущую позицию - поле экземпляра, то не было бы вопросов ни к чему. Кроме действий юзера, конечно. Но потери валидности итераторов можно было бы избежать в ряде случаев. То есть есть за что платить. Добавлено через 8 минут Undisputed, размер библиотечного файла vector больше от того что в нём присутствуют 2 варианта. Это потому, что ни чего не бывает бесплатно. Вопрос всегда в том, как оптимизировать цену, а это вопрос компромисса. Набор условий задачи против набора: ум, честь и совесть того кто решает задачу, плюс его величество случай. Вот и всё что определяет цену. На базаре всегда два дурака. Но задачи бывают и умные.
0
|
5 / 5 / 1
Регистрация: 15.12.2015
Сообщений: 51
|
|
21.08.2019, 13:12 [ТС] | 23 |
Ничего себе, какую крутую вы тут беседу развели! Жаль, что я пока ещё не всё понимаю)
TRam_, TheCalligrapher, Новичок, спасибо большое вам за разъяснения!! Вот стоило ведь мне догадаться о том, что такой подход прост и прекрасен, но я не догадался. Зато теперь я понимаю ещё одну вещь: если что-то кажется странным, то нужно просто посмотреть на это с другой стороны, расширить свой взгляд. IGPIGP, спасибо за ваш ответ с философской ноткой! Мне сейчас пока не всё понятно, но я возьму сказанное Вами на заметку.
0
|
Комп_Оратор)
|
|
21.08.2019, 14:25 | 24 |
Мы даже до середины не дошли. Марауль, есть простая истина: обобщение необобщаемого это боль. Если говорить о контейнерах STL то некоторые обобщения противоестественны. Структуры произвольного и последовательного доступа сортируются по разному, например. Поиск в бинарных деревьях поиска (BST:set/map) идёт иначе чем в векторах или списках, хотя для упорядоченных векторов есть бинарные алгоритмы верхней/нижней границы... Но различия идут глубже. BST - контейнеры с не детерминированной структурой. То есть, на одном и том же наборе элементов взаимо размещение нодов (топология) зависит от порядка поступления данных. В числе следствий - тот простой факт, что описание положения нода в дереве - не тривиальная задача. Там много различий с такими зверями как вектор или список. Например, когда поиск в BST не удачен, то это значит мы достигли листа в какой-то ветке. То есть у дерева много хвостов, - это такой себе змей Горыныч наоборот. Но создатели библиотеки делают подстановку итератора на следующий за последним (по предикату) элементом. Таким образом, последовательное прохождение для всех контейнеров внешне вполне обобщаемо. Но это кажущееся благополучие.
Главное, что вы можете задать глубокий вопрос. Остальное, - вопрос вашего упорства, времени и возможности его тратить на удивительный мир С++. Удачи)
0
|
21.08.2019, 14:25 | |
21.08.2019, 14:25 | |
Помогаю со студенческими работами здесь
24
STL. Не работает вывод через << в поток когда использую итераторы :( Найти элемент в контейнере priority_queue, используя STL вские итераторы и алгоритмы Можно ли использовать такой подход в классах? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |