Я учусь использовать шаблоны С++ , stl
и эта библиотека содержит класс list<T>
, я понимаю, что он имеет функции, аналогичные функциям vector<T>
(если нет, пожалуйста, проиллюстрируйте меня) .
Мой вопрос: как я могу получить доступ к элементу внутри объекта типа list<T>
по заданному индексу?
До сих пор я пробовал это:
std::list<int> Numeros = /* Mi asignación aquí */;
int n = Numeros[0]; // Error.
Тем не менее, его использование std::vector<T>
работает отлично:
std::vector<T> Numeros = /* Alguna asignación */;
int n = Numeros[0]; // Asumiendo que tenemos un elemento aquí, me devuelve el valor.
Можно ли получить доступ к значениям, содержащимся в list<T>
индексе?
Хотя все контейнеры stl имеют определенное сходство с точки зрения использования, правда в том, что каждый из них работает по-разному, поэтому не все методы будут доступны во всех контейнерах.
std::vector
представляет собой неупорядоченный список элементов. Его основная характеристика заключается в том, что все элементы располагаются в памяти непрерывно, что обеспечивает произвольный доступ. Это контейнер по умолчанию для большинства ситуаций.std::list
представляет собой связанный список. Будучи связанным списком, его элементы не должны быть непрерывными в памяти, но чтобы получить доступ ко второму элементу, прежде чем вы должны получить доступ к первому. Именно по этой последней причине он не поддерживает произвольный доступ, хотя и поддерживает последовательный доступ.Традиционно контейнеры STL можно обойти универсально с помощью итераторов:
В STL также есть функции, которые пытаются немного инкапсулировать эту механику:
std::foreach
: перебирает контейнер и для каждого элемента выполняет функцию, переданную параметромstd::transform
: перебирает контейнер и для каждого элемента выполняет операцию, переданную параметром. Результат указанной операции сохраняется в новом контейнере.std::find
: Перебрать контейнер в цикле в поисках элемента, переданного параметром. Возвращает итератор элементу или, если он не найден, итератор, заданныйcontenedor.end()
std::find_if
: Аналогичен предыдущему, но допускает указатель на функцию, реализующую критерии поиска.std::reverse
: инвертирует значения, которые находятся между итераторами, переданными в качестве параметра (глаза, в упорядоченных контейнерах, так какset
они не будут работать)Начиная с C++11, также доступен новый тип цикла, который позволяет вам легко перебирать контейнеры, избегая использования итераторов:
Кроме того, начиная с C++11,
std::begin
доступны файлыstd::end
. Эти две функции позволяют получить соответствующие итераторы как в STL-контейнерах, так и в массивах фиксированного размера (их размер можно вычислить во время компиляции):Другими механизмами работы с итераторами являются:
std::distance
: вычисляет количество элементов между двумя итераторами.std::next
: Позволяет продвигать итератор на n позиций.std::advance
: Подобно предыдущему, он изменяет итератор, переданный в качестве параметра.Что ж, все вышесказанное было немного теорией о контейнерах и их возможностях. Теперь, отвечая на ваш вопрос, да, можно получить доступ к определенной позиции как в, так
std::list
и в любом другом контейнере, используя итераторы иstd::next
илиstd::advance
.В конкретном случае
std::list
невозможно получить доступ к определенному элементу с помощью оператора индексации,[]
поскольку его элементы не находятся в последовательных ячейках памяти. Доступ к случайному элементу подразумевает обход части узлов списка, и эта задача выполняется итераторами и должна выполняться явно.Всего наилучшего.
Я просмотрел документацию
stl
и некоторые вопросы SO , я столкнулсяstd::advance()
иstd::next()
:std::next(Vector, Numero)
: возвращает указатель в пределах индекса (параметра)Numero
назначаемым способом, возвращает элемент того же типа, что и вектор. Documentation , стоит отметить, что без параметраNumero
эта функция переходит к следующему элементу вектора, поэтому этот параметр является необязательным.std::advance(Vector, Cantidad)
: Работает практически так же, какstd::next()
за исключением того, что напрямую модифицирует параметрVector
по элементу, находящемуся в позицииCantidad
, и не возвращает никакого значения. ДокументацияПример с
std::next(V,N)
:Пример с
std::advance(V,N)
:Стоит отметить, что параметр
Cantidad
, который я назвал,std::advance()
является обязательным.int_list.begin()
поместить указатель в начало спискаint_list.end()
указатель на конец спискаУказатель в начале списка перемещается к следующему элементу с помощью арифметики указателя:
list_iter++