Helpers - компьютеры, интернет, программирование

Понимание реализации iterator/const_iterator

Я знаю, как использовать итераторы на поверхностном уровне, но я пытаюсь понять, как итераторы работают по отношению к контейнерному классу, такому как vector.

Согласно , почему мы помещаем :: (оператор разрешения области) перед итератор?

std::vector — это шаблон класса в пространстве имен std, что делает std::vector<double> классом.

std::vector<T>::iterator является вложенным типом под std::vector<T>

Насколько я понимаю, шаблон класса vector имеет член типа iterator, который он получает из шаблона класса в #include <iterator>.

Это сбивает с толку, потому что, когда я смотрю на http://www.cplusplus.com/reference/iterator/iterator/ в #include <iterator> нет шаблона класса const_iterator, который я вижу?

10.12.2019

  • en.cppreference.com/w/cpp/container/vector 10.12.2019
  • шаблон класса vector имеет член типа iterator, который он получает из шаблона класса в #include <iterator> — это неверно. Тип члена iterator из vector определяется реализацией. Это может быть даже псевдоним для value_type*. Здесь не требуется использовать std::iterator. 10.12.2019
  • @DanielsaysreinstateMonica, а, так в некоторых реализациях используется шаблон из ‹iterator›? если нет, то какова цель шаблона класса итератора в #include ‹iterator› 10.12.2019
  • он вообще бесполезен, поэтому он устарел: en.cppreference.com /w/cpp/итератор/итератор 10.12.2019
  • в некоторых реализациях используется шаблон из <iterator>? Вы можете проверить исходный код, например, libstdc++, libc++ или Microsoft. Но я так не думаю; как указал Алан, std::iterator теперь устарело, начиная с С++ 17. 10.12.2019
  • так является ли итератор просто определяемым пользователем типом с именем iterator, который реализован в контейнерах? 10.12.2019
  • @csguy Не обязательно. Как я уже говорил, это может быть псевдоним типа и для типа-указателя-значения. Однако реализации стандартной библиотеки AFAIK, С++ определяют свои собственные типы классов для итераторов контейнеров. 10.12.2019
  • В спецификации std::vector нет ничего, что говорило бы о том, что vector::iterator или vector::const_iterator имеют какое-либо конкретное отношение к std::iterator (даже в стандартах, предшествовавших устареванию std::iterator). Кроме того, хотя iterator и const_iterator являются типами, объявленными в области vector, нет требования, чтобы vector имел член любого типа - iterator и const_iterator являются частью интерфейса std::vector, например. перегрузки члена begin() возвращают эти типы, но ничего не говорится о том, как эти функции получают возвращаемый ими итератор. 10.12.2019
  • @ThomasSablik Нет. const_iterator дает вам T const. const iterator дает вам T, но вы не можете использовать итератор для итерации, так как он является константой. так что в принципе бесполезно :D 10.12.2019
  • @Peter, нет требований к членам iterator и const_iterator в классах контейнеров? 10.12.2019
  • @csguy Существует требование для функции begin и end, которая возвращает итераторы (или необработанные указатели, поскольку это удовлетворяет требованиям для итератора). Ничто не говорит о том, что итератор должен быть реализован в контейнере. 10.12.2019
  • @super требуется ли, чтобы этот итератор имел имя итератора, поэтому синтаксис std::container<some type>::iterator работает в чем-то вроде std::container<some type>::iterator i = container.begin() 10.12.2019
  • @csguy Если вы посмотрите, например, на std::vector, вы увидите, что есть список типов членов. Включает iterator, const_iterator и value_type среди прочих. Обычно это псевдонимы типов, using iterator = ...; определенные внутри класса. 10.12.2019
  • @super хм, я вижу ... поэтому контейнеры определяют эти типы членов обычно с псевдонимом типа для чего-то вроде LegacyRandomAccessIterator, который является указателем на элемент массива, удовлетворяющим всем требованиям LegacyRandomAccessIterator. 10.12.2019
  • да. Но LegacyRandomAccesIterator — это категория итератора. Указатель удовлетворяет требованиям LegacyRandomAccesIterator. 10.12.2019
  • Примечание. Примером контейнера без итераторов является std::pair. 13.12.2019

Ответы:


1

Собрана информация из комментариев:

  • std::iterator из #include <iterator> устарело, начиная с C++17

  • До того, как он стал устаревшим, для контейнеров STL (которые определяются реализацией) было возможно реализовывать итераторы с помощью класса шаблона std::iterator.

  • #P4# <блочная цитата> #P5#
  • #P6# <блочная цитата> #P7#
  • Контейнеры STL определяют эти типы членов (iterator, const_iterator и т. д.), обычно с псевдонимом типа для некоторой категории итераторов, такой как LegacyRandomAccessIterator, которая определяется как «Указатель на элемент массива удовлетворяет всем требованиям LegacyRandomAccessIterator».

13.12.2019
Новые материалы

Интуитивное понимание тензоров в машинном обучении
Тензор является важной концепцией во многих научных областях, таких как математика, физика, обработка сигналов и компьютерное зрение, и это лишь некоторые из них. В математике тензор — это..

Использование машинного обучения для диагностики болезни Альцгеймера, часть 4
Маркеры семантической согласованности для ранней диагностики болезни Альцгеймера (arXiv) Автор: Давиде Колла , Маттео Дельсанто , Марко Агосто , Бенедетто Витиелло , Даниэле Паоло Радичони..

Почему объяснимость так важна прямо сейчас?
По мере того, как системы искусственного интеллекта и инструменты на основе машинного обучения распространяются в нашей повседневной жизни, как практики, так и критики все чаще заявляют о..

Анимированный математический анализ
Использование Manim для создания математических анимированных визуализаций Визуализация данных помогает понять скрытые закономерности в данных, которые невозможно визуализировать..

Создание простого слайдера изображений с помощью JavaScript
Узнайте, как создать базовый слайдер изображений с помощью HTML, CSS и JavaScript. Введение В этом уроке мы создадим удобный слайдер изображений, используя JavaScript, HTML и CSS. Ползунок..

Создание базы данных с помощью супергероя «Python»
В этом посте мы узнаем, как создать «базу данных SQLite с помощью модуля python sqlite3, создав простую функцию входа и регистрации. Готовы ли вы к этому путешествию? Если да , давайте приступим..

ИИ для чайников: руководство для начинающих по пониманию будущего технологий
Вы чувствуете, что остались позади в мире ИИ? Не волнуйтесь, вы не одиноки! Со всей этой шумихой вокруг искусственного интеллекта может быть трудно понять, с чего начать. Но не позволяйте сленгу..