Insert c vector как работает

от admin

Вставить элемент в начало вектора в C++

В этом посте мы обсудим, как вставить элемент в начало вектора в C++.

1. Использование std::vector::insert функция

Стандартное решение для вставки элемента в vector — это std::vector::insert функция. Он переводит итератор в позицию, в которую нужно вставить элемент. Чтобы вставить элемент в начало вектора, передайте итератор, указывающий на первый элемент в векторе. Например,

результат:

1 2 3 4 5

2. Использование std::rotate функция

В качестве альтернативы мы можем добавить элемент в конец вектора, а затем повернуть vector вправо на 1 позицию. Типичная реализация этого подхода будет выглядеть так:

результат:

1 2 3 4 5

3. Использование std::deque

Чтобы добавить и удалить элементы как с передней, так и с задней части контейнера, рассмотрите возможность использования std::deque . Он реализует двустороннюю queue, которая может увеличиваться или уменьшаться на обоих концах. Чтобы вставить элемент в начало, используйте push_front членская функция std::deque , как показано ниже:

Insert c vector как работает

Для добавления элементов в вектор применяется функция push_back() , в которую передается добавляемый элемент:

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

Функция emplace_back() выполняет аналогичную задачу — добавляет элемент в конец контейнера:

Добавление элементов на определенную позицию

Ряд функций позволяет добавлять элементы на определенную позицию.

emplace(pos, value) : вставляет элемент value на позицию, на которую указывает итератор pos

insert(pos, value) : вставляет элемент value на позицию, на которую указывает итератор pos, аналогично функции emplace

insert(pos, n, value) : вставляет n элементов value начиная с позиции, на которую указывает итератор pos

insert(pos, begin, end) : вставляет начиная с позиции, на которую указывает итератор pos, элементы из другого контейнера из диапазона между итераторами begin и end

insert(pos, values) : вставляет список значений начиная с позиции, на которую указывает итератор pos

Удаление элементов

Если необходимо удалить все элементы вектора, то можно использовать функцию clear :

Функция pop_back() удаляет последний элемент вектора:

Если нужно удалить элемент из середины или начала контейнера, применяется функция std::erase() , которая имеет следующие формы:

erase(p) : удаляет элемент, на который указывает итератор p. Возвращает итератор на элемент, следующий после удаленного, или на конец контейнера, если удален последний элемент

erase(begin, end) : удаляет элементы из диапазона, на начало и конец которого указывают итераторы begin и end. Возвращает итератор на элемент, следующий после последнего удаленного, или на конец контейнера, если удален последний элемент

Также начиная со стандарта С++20 в язык была добавлена функция std::erase() . Она не является частью типа vector. В качестве первого параметра она принимает вектор, а в качестве второго — элемент, который надо удалить:

В данном случае удаляем из вектора numbers3 все вхождения числа 1.

Размер вектора

С помощью функции size() можно узнать размер вектора, а с помощью функции empty() проверить, путой ли вектор:

С помощью функции resize() можно изменить размер вектора. Эта функция имеет две формы:

resize(n) : оставляет в векторе n первых элементов. Если вектор содержит больше элементов, то его размер усекается до n элементов. Если размер вектора меньше n, то добавляются недостающие элементы и инициализируются значением по умолчанию

resize(n, value) : также оставляет в векторе n первых элементов. Если размер вектора меньше n, то добавляются недостающие элементы со значением value

Важно учитывать, что применение функции resize может сделать некорректными все итераторы, указатели и ссылки на элементы.

Изменение элементов вектора

Функция assign() позволяет заменить все элементы вектора определенным набором:

В данном случае элементы вектора заменяются набором из четырех строк «C++».

Также можно передать непосредственно набор значений, который заменит значения вектора:

Еще одна функция — swap() обменивает значения двух контейнеров:

Сравнение векторов

Векторы можно сравнивать — они поддерживают все операции сравнения: <, >, <=, >=, ==, !=. Сравнение контейнеров осуществляется на основании сравнения пар элементов на тех же позициях. Векторы равны, если они содержат одинаковые элементы на тех же позициях. Иначе они не равны:

Вектора в С++ часть 5 (функции insert(), swap(), shrink_to_fit())

Вектора, позволяют помещать число в любую ячейку вектора (даже если эта ячейка уже занята), пример для понимания:

Работа нашей программы:

В 6 строке объявлен вектор размером из трех элементов типа int и сразу же заполнили его числом 100. В строке 7 мы объявляем итератор it , в 8 строке наш итератор указывает на нулевой элемент нашего вектора. В 11 строке мы встречаем новую функцию vector::insert() .

Читать:
Itunes store что это

Функция vector::insert() принимает два аргумента (первый – указатель на ячейку вектора, куда будет помещено число, второй – само помещаемое число). Так как итератор it указывает на vecInt[0] , нулевой элемент вектора, то теперь vecInt[0]=200 . Длина вектора соответственно увеличивается на один элемент. В строке 14 итератор it теперь указывает на третий элемент вектора, т. е. vecInt[3] , соответственно назначение строки 15 становиться уже понятно.

В строке 16 число 900 мы записываем в позицию it+1 или vecInt[3+1] . В строках с 19-22 осуществляется вывод вектора, но это должно быть уже Вам понятно. В строке 24 используется функция vector::max_size() , которая выводит максимальный размер вектора, т. е. максимально возможное количество, элементов которое может вместить в себя вектор. В строке 26 встречается новая функция vector::resize () , функция позволяет увеличить размер вектора до заданной величины, в данном случае вектор расширяется до 10 элементов.

Если функция vector::resize() позволяет уменьшить размер вектора, то функция vector::reserve( ) имеет обратное действие, она позволяет расширить вектор до заданной величины, рассмотрим пример:

Работа нашей программы:

В строке 7 мы объявили два вектора. С помощью цикла в строках 8-12 заполняем наши вектора. В строках 16 и 20, выводим содержимое наших векторов. В строке 22 нам встречается функция vector::swap() , которая позволяет поменять содержимое наших векторов. Иными слова содержимое вектора vecFirst теперь принадлежит vecSecond , а содержимое vecSecond принадлежит vecFirst . Строки 26 и 30 (где осуществляется вывод на экран) наглядно демонстрируют это.

В строке 32, я хотел продемонстрировать, что можно менять местами только определенные элементы векторов. В этой строке у вектора vecFirst и вектора vecSecond происходит обмен последними элементами (если вдруг забыли: функция vector::back() обращается к последнему элементу вектора). В 36, 40 строках выводятся на экран наши вектора. В строке 43 производится вывод вместимости вектора. В строке 44 при помощи функции vector::reserve() мы просим увеличить этот объем до 20 элементов и в строке 47 мы действительно видим, что так и вышло.

У векторов есть замечательная функция vector::shrink_to_fit() позволяющая уменьшить количество используемой памяти вектором, пример:

ВАЖНО Функцию vector:: shrink_to_fit() я вынес в отдельную программу, потому, как она введена в стандарте C++11 и если Ваш компилятор не поддерживает этот стандарт, код не скомпилируется.

В строке 7 объявили вектор, состоящий из десяти элементов. В 10 строке мы снова встречаем функцию vector::capacity() .Как видите вектор содержит 10 элементов. В 11 строке мы очищаем этот вектор (удаляем в нем все элементы). В 14 строке мы видим, что наш вектор может содержать 10 элементов (не забываем, что вектор уже пуст). В 15 строке мы знакомимся с функцией vector:: shrink_to_fit() . Эта функция уменьшает количество используемой памяти нашего вектора (иначе говоря, у нас есть вектор из 10 элементов, но он пустой, эта функция возвращает память системе, которую занимал наш пустой вектор). В 18 строке мы видим, что вектор сжался в нуль.

Как работает метод insert в в классе Vector в с++?

В методе insert класса Vector нужно передать итератор указывающий на позицию в которую ты хочешь поместить элемент, я правильно понимаю что для того чтобы поместить тот или иной элемент в заданную позицию нужно итерироваться через весь список пока не найдется нужная позиция ?

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

зачем тогда в методе добавлять ссылку на итератор можно же просто позицию обозначить?

Ответ на этот вопрос проще дать на примере. Например я хочу имплементировать функцию, которая вставляет элемент в n-ю позицию:

Эта функция будет работать с многими контейнерами, такими как std::vector std::list std::deque и пр. Если бы в векторе был доступен только метод с индексом, такая функция бы не работала с многими другими контейнерами.

Похожие статьи