C vector обратиться к элементу

Обновлено: 06.07.2024

Быстрый переход по статье:

Итератор на list, set, map

Для итераторов на list , set , map немного урезан функционал. Так вы не можете:

Все остальное можно использовать:

  • Сравнивать два итератора на равенство и неравенства:

Вот как она работает:

Если мы увеличиваем итератор, то используем оператор + к числу. Но можно и просто записать число без оператора + .

Если же нужно уменьшить итератор, то мы добавляем оператор - .

Итератор это не указатель

Сейчас после всего узнанного многие могут подумать, что итераторы это и есть указатели. Так как очень много общего между ними.

  • Итератор, как и указатель указывает на какую-то ячейку, а в указателе может храниться адрес ячейки динамического массива.
  • Чтобы обратится к значению ячейки мы применяем операцию разыменования.

Да итератор это усовершенствованная версия указателя, которая только работает с контейнерами. В некоторых языках указатель называют итератором, но это не значит, что он и есть указатель в C++.

Чтобы удостовериться в том, что итератор это не указатель давайте проверим это в программе ниже.

Только один вопрос.
Как напрямую обратится к элементу объекта, который находится в векторе.

Например у нас есть вектор. он хранит объекты класса Students.

Как мне напрямую через вектор обратится к полю name,group, step .
Сравнивать их и тд.

Доступ к элементу объекта в векторе
Есть два класса. Второй класс содержит вектор объектов первого. Причем конструктор второго класса.


Как обратиться к функции класса, который находится в листе?
Как обратиться к функции класса, который находится в листе? В классе есть функция Move. .

Как обратиться к элементу списка
У меня есть список, в нём присутствует 4 позиции: Имя файла, размер, таймер-счётчик и флаг. Меня.

Как обратиться к элементу вектора?
Помогите пожалуйста cout << "Введите размерность массива\n"; int n; cin >> n;.

Если данные-члены в закрытом разделе, то нужно сделать, в открытом разделе, функции доступа (геттеры/сеттеры), к закрытым данным.

Как создать итератор

Для создания итератора мы должны с самого начала программы подключить библиотеку <iterator> .

Далее для его создании нам потребуется использовать вот эту схему:

Вам нужно помнить! Если вы создали итератор и случайно ввели не тот тип данных, который указали при создании контейнера, то ваша программа будет работать неправильно и вообще может сломается.


Как сравнить два вектора

Если в середине программы нам понадобиться сравнить два массива, мы, конечно, используем цикл for и поочередно проверим все элементы.

Вектор снова на шаг впереди! Чтобы нам сравнить два вектора, потребуется применить всего лишь оператор ветвления if.

Определяет вектор шаблона класса контейнера и несколько вспомогательных шаблонов.

vector — это контейнер, который упорядочивает элементы данного типа в виде линейной последовательности. Он обеспечивает быстрый произвольный доступ к любому элементу и позволяет динамически добавлять элементы в последовательность и удалять их. vector является наиболее подходящим типом контейнера для последовательности, когда на первом месте стоит производительность произвольного доступа.

Подробнее о классе vector см. в разделе Класс vector. Дополнительные сведения о специализации vector<bool> см. в разделе <bool> класс Vector.

Что такое итератор

Кстати по мере того, как мы будем изучать итераторы, вам все больше будет казаться, что итераторы и есть указатели (это мы разберем ниже).

Методы начала и конца контейнеров

  • Метод begin() отправит итератор на начала контейнера.
  • А метод end() отправит на конец. А если точнее, то на одну ячейку больше последней. Если мы попытаемся вывести эту ячейку у нас появятся проблемы с компилятором 🙂 .

Их мы можем использовать даже без подключения библиотеки <iterator> , что очень удобно.

Также при инициализации итератора мы можем с самого начала написать, куда он будет указывать:

Как работают итераторы

Чтобы понять, как работают итераторы, давайте разберем их использование на практике. В примере ниже с помощью итератора мы выводим содержимое вектора на экран:

for ( it = name_vector . end ( ) - 1 ; it >= name_vector . begin ( ) ; it -- ) <
  • В строке 10: создали вектор name_vector .
  • Дальше в последующих трех строках занимаемся его заполнением.
  • В строке 16: создали итератор под именем it .
  • В цикле for мы написали, что итератор указывает на последнюю ячейку вектора. С помощью вот такой не замысловатой конструкции :

Выше мы говорили, что метод end() указывает на одну ячейку больше последней. Поэтому, чтобы обратится к последнему элементу в векторе нам понадобилось отнять 1.

  • Используя операцию разыменования, в теле цикла, мы вывели все элементы.

Вы наверняка заметили, что мы выводим элементы задом наперед:

Важно знать! Если мы захотели выполнить операцию разыменования для ячейки, у которой индекс больше итератора на 5, то это сделать нужно именно так:

Если мы сделаем так, то мы выведем сумму ячейки на которую указывает итератор и пяти. А хотели же прибавить к итератору пять и применить операцию разыменования.

Все потому что, операция разыменования * происходит быстрее, чем операция присваивание. У этих операций совсем разный приоритет использования. У этой * больше, а у этой + меньше.

Как создать вектор (vector) в C++

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

Далее, чтобы объявить вектор, нужно пользоваться конструкцией ниже:

  • Вначале пишем слово vector .
  • Далее в угольных скобках указываем тип, которым будем заполнять ячейки.
  • И в самом конце указываем имя вектора.

В примере выше мы создали вектор строк.

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

Такой способ инициализации можно использовать только в C++!

Второй способ обратиться к ячейке

Мы знаем, что в векторе для обращения к ячейке используются индексы. Обычно мы их используем совместно с квадратными скобками [] .

Вот как она работает на практике:

ivector . at ( 1 ) = 5 ; // изменили значение второго элемента

Давайте запустим эту программу:

Как указать количество ячеек для вектора

Указывать размер вектора можно по-разному. Можно это сделать еще при его инициализации, а можно хоть в самом конце программы. Вот, например, способ указать длину вектора на старте:

Так в круглых скобках () после имени вектора указываем первоначальную длину. А вот второй способ:

cout << "Значения второго вектора (с помощью reserve): " << endl ;

Как видим, в первом случае мы вывели три нуля, а во втором: 17, 0, 0.

Все потому, что при использовании первого способа все ячейки автоматически заполнились нулями.

При объявлении чего-либо (массива, вектора, переменной и т.д) мы выделяем определенное количество ячеек памяти, в которых уже хранится ненужный для ПК мусор. В нашем случае этим мусором являются числа.

Синтаксис

Параметры

Тип
Параметр-шаблон для типа данных, хранящихся в векторе.

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

Что такое вектор (vector)

Итератор на vector

Для итератора на vector вы можете:

  • Выполнять операцию разыменования (обращаться к значению элемента на которое указывает итератор), как мы это делали с указателем.
  • Использовать инкремент ( it++, ++it ) и декремент ( it--, --it ).
  • Применять арифметические операции. Так например мы можем сместить итератор на пять ячеек в право, вот так:

Но о использовании арифметических и сравнительных операциях ( > , < , == ) с двумя итераторами, вам нужно кое что знать.

Использовать выше сказанные операции можно только с идентичными итераторами, которые указывают на одинаковый контейнер и тип.

vector < double > :: iterator it2 = vector_second . begin ( ) ;

Читайте также: