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

159
14 августа 2019, 04:50

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

Answer 1

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

Answer 2

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

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

template<class Container,class T>
void insert_into_pos( Container &c, size_t pos, T obj )
{
    if( pos >= c.size() ) throw std::runtime_error( "invalid position" );
    c.insert( std::next( c.begin(), pos ), std::move( obj ) );
}

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

READ ALSO
Работа с указателями в С++

Работа с указателями в С++

Извините за глупый вопрос, но я только начал осваивать С++Нашел в интернете код, где написана строка, но так и не смог понять, что она означает

95
Как лучше всего организовать структуру C++ проекта, использующего CMake и юнит-тесты? [закрыт]

Как лучше всего организовать структуру C++ проекта, использующего CMake и юнит-тесты? [закрыт]

Как лучше всего организовать структуру C++ проекта, использующего CMake и юнит-тесты?

135
Как в CMake подключить библиотеку libbacktrace?

Как в CMake подключить библиотеку libbacktrace?

Пишу проект под linux с использованием GCC и CMakeДля правильной работы boost::stacktrace понадобилось подключить библиотеку libbacktrace

99
Освобождается ли куча от массива

Освобождается ли куча от массива

Пусть у меня есть следующая функция:

108