Insert c vector как работает
Перейти к содержимому

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

  • автор:

Understanding Vector insert() in C++

Understanding Vector insert() in C++

While we believe that this content benefits our community, we have not yet thoroughly reviewed it. If you have any suggestions for improvements, please let us know by clicking the “report an issue“ button at the bottom of the tutorial.

Introduction

In this tutorial, we are going to learn about vector insert() in C++. As well as look at how it works and can be used to accomplish the insertion operation in different ways with examples.

The vector::insert() function in C++

Basically, the vector::insert() function from the STL in C++ is used to insert elements or values into a vector container. In general, the function returns an iterator pointing to the first of the inserted elements.

Using the insert() Function on Vectors

The insert() method can be used to insert single or multiple elements into a given vector in different ways, for different cases. We can insert a single value at our desired position, we can even insert multiple values into the vector at once, and even we can insert a bunch of values from another vector to it. So, let us see how we can do that with ease.

1. Insert a single value into a Vector

We can directly pass an iterator pointing to our desired position and the value to be inserted there to the insert() function to modify a vector. Look carefully at the example below, here we try to insert a value 10 at the beginning of the vector.

#include #include using namespace std; int main()  vectorint> vec 1,2,3,4,5>; cout<"Intially vector: "; for(auto i=vec.begin(); ivec.end(); i++)  cout<" "<*i; > vec.insert(vec.begin(),10);//Inserting 10 to the vector cout<"\n\nThe modified vector is: "; for(auto i=vec.begin(); ivec.end(); i++)  cout<" "<*i; > return 0; > 

Output;

Intially vector: 1 2 3 4 5 The modified vector is: 10 1 2 3 4 5 
  • Firstly we initialize a vector, vec . And print the same,
  • Then we call the insert() function on the vector vec with parameters vec.begin() and 10(new value). Note, here vec.begin() returns an iterator pointing to the start of the vector,
  • After the insertion has been done we print the new vector using a simple for loop to see the resultant vector.

2. Insert the same value Multiple times

We can also insert multiple values to a vector at once using the insert() function. This can be done by passing an iterator pointing to our starting position where we want to insert, the number of times the value is going to repeat, and at last the value.

The example below illustrates the use properly.

#include #include using namespace std; int main()  vectorint> vec 10,20,30,40>; cout<"Intially vector: "; for(auto i=vec.begin(); ivec.end(); i++)  cout<" "<*i; > vec.insert(vec.end(),3,100);//Inserting 100, 3 times to the vector cout<"\n\nThe modified vector is: "; for(auto i=vec.begin(); ivec.end(); i++)  cout<" "<*i; > return 0; > 

Output;

Intially vector: 10 20 30 40 The modified vector is: 10 20 30 40 100 100 100 
  • We initialize our vector vec and print the same,
  • Then we pass an iterator pointing to the end of the vector, as returned by vec.end() , 3(the number of times we want the value to repeat), and the value 100 to the insert() function.
  • In this way, as we can observe from the output, 100 is inserted thrice at the end of the vector, vec .

3. Insert Another Vector

Further, we can also insert elements of another vector to our old vector. Just we need to pass an iterator pointing to the position in our vector where we need to insert another vector. Along with that, the iterators pointing to the starting and end of the second vector.

Let us take a small example to understand the working.

#include #include using namespace std; int main()  vectorint> vec 2,4,6,8>; vectorint> vec2 1,3,5,7>; cout<"Intially first vector: "; for(auto i=vec.begin(); ivec.end(); i++)  cout<" "<*i; > cout<"\nIntially second vector: "; for(auto i=vec2.begin(); ivec2.end(); i++)  cout<" "<*i; > //Inserting vec2 at the beginning of the vec vector vec.insert(vec.begin(),vec2.begin(),vec2.end()); cout<"\n\nThe modified vector is: "; for(auto i=vec.begin(); ivec.end(); i++)  cout<" "<*i; > return 0; > 

Output;

Intially first vector: 2 4 6 8 Intially second vector: 1 3 5 7 The modified vector is: 1 3 5 7 2 4 6 8 

Here, vec and vec2 are two vectors. Out of which vec2 is the one whose elements we need to insert into the vector, vec. We call the insert() function with appropriate parameters as mentioned earlier. This modifies our vector vec , resulting in the insertion of the second vector elements at the beginning.

Conclusion

So, in this tutorial, we explained the working as well as the use of the vector insert() function from the STL in C++. For better understanding, we recommend trying the above code snippets yourselves. And for any questions, feel free to comment below.

References

  • Replace an element into a specific position of a vector — Stack Overflow Question,
  • How to insert an element into the beginning of a vector? — Stack Overflow Question,
  • Vectors in C++ — JournalDev Tutorial.

Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.

Нужна реализация функции std::vector::insert()

Нужна реализация функции std::vector::insert()
1)iterator insert (iterator position, const value_type& val);
2) void insert (iterator position, size_type n, const value_type& val);
3)template
void insert (iterator position, InputIterator first, InputIterator last);
Может кто то подсказать реализацию уже готовую? Что бы самому не писать?

Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Реализация класса MyString. Стандартная библиотека, std::string, std::vector
как добавить реализацию конкатенации строк через перегрузку оператора "+=" в классе MyString и.

На основе исходного std::vector содержащего числа, создать std::vector с этими же числами
подскажите есть вот такая задача. Есть список . Создать второй список, в котором будут все эти же.

Как передать целочисленную матрицу типа std::vector > в функцию?
Здравствуйте. Почитал на форуме, но так и не понял что я делаю не так. Имеется двумерный вектор.

Эксперт С++

8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562

vvb2011, Учитывая, что используется твой вектор — в любом случае писать придется самому. А так можешь посмотреть реализацию в gcc/clang.

Регистрация: 09.01.2016
Сообщений: 50

ForEveR, мне бы посмотреть как он реализован. я под свой переделаю. Можете сылку кинуть. а то я не понял где искать)

Эксперт С++

8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562

Лучший ответ

Сообщение было отмечено gru74ik как решение

Решение

vvb2011, Например тут: https://gcc.gnu.org/onlinedocs. ource.html
Регистрация: 09.01.2016
Сообщений: 50
(ForEveR, так код сложный, и много чего мне не понятно(

Эксперт С++

8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562

vvb2011, Ну это реализация стандартной библиотеки. Вы же пишете вектор сами — вот и insert напишите сами.

Регистрация: 09.01.2016
Сообщений: 50

ForEveR, та да, но даже чтобі понять как там что работает. я не могу. не понятно

Добавлено через 6 минут
Я до этого написал, как думаю: Сам смысл

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
template typename T, typename Allocator> typename VectorT, Allocator>::iterator VectorT, Allocator>::insert(iterator position, const value_type& val) { size_type count = position - begin(); if (position != end()) { grow(position) m_allocator.construct(position, value) ++m_size(); } else { unitialized_copy(position - 1, end(), val); ++m_size(); } }

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

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

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

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

std :: vector < int >v = < 2 , 3 , 4 , 5 >;
int target = 1 ;
// добавляем цель в начале
v . insert ( v . begin ( ) , target ) ;
// печать вектора
std :: copy ( v . begin ( ) , v . end ( ) , std :: ostream_iterator < int >( std :: cout , » » ) ) ;

результат:

1 2 3 4 5

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

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

std :: vector < int >v = < 2 , 3 , 4 , 5 >;
int target = 1 ;
// добавляем цель в начале
v . push_back ( target ) ;
std :: rotate ( v . rbegin ( ) , v . rbegin ( ) + 1 , v . rend ( ) ) ;
// печать вектора
std :: copy ( v . begin ( ) , v . end ( ) , std :: ostream_iterator < int >( std :: cout , » » ) ) ;

результат:

1 2 3 4 5

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

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

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

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

#include #include int main() < std::vectornumbers; // пустой вектор numbers.push_back(5); numbers.push_back(3); numbers.push_back(10); for(int n : numbers) cout << n << "\t"; // 5 3 10 std::cout

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

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

std::vector numbers< 1, 2, 3, 4, 5 >; numbers.emplace_back(8); // numbers = < 1, 2, 3, 4, 5, 8 >;

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

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

  • 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
std::vector numbers< 1, 2, 3, 4, 5 >; auto iter = numbers.cbegin(); // константный итератор указывает на первый элемент numbers.emplace(iter + 2, 8); // добавляем после второго элемента numbers = < 1, 2, 8, 3, 4, 5>;
std::vector numbers1< 1, 2, 3, 4, 5 >; auto iter1 = numbers1.cbegin(); // константный итератор указывает на первый элемент numbers1.insert(iter1 + 2, 8); // добавляем после второго элемента //numbers1 = < 1, 2, 8, 3, 4, 5>; std::vector numbers2 < 1, 2, 3, 4, 5 >; auto iter2 = numbers2.cbegin(); // константный итератор указывает на первый элемент numbers2.insert(iter2 + 1, 3, 4); // добавляем после первого элемента три четверки //numbers2 = < 1, 4, 4, 4, 2, 3, 4, 5>; std::vector values < 10, 20, 30, 40, 50 >; std::vector numbers3 < 1, 2, 3, 4, 5 >; auto iter3 = numbers3.cbegin(); // константный итератор указывает на первый элемент // добавляем после первого элемента три первых элемента из вектора values numbers3.insert(iter3 + 1, values.begin(), values.begin() + 3); //numbers3 = < 1, 10, 20, 30, 2, 3, 4, 5>; std::vector numbers4 < 1, 2, 3, 4, 5 >; auto iter4 = numbers4.cend(); // константный итератор указывает на позицию за последним элементом // добавляем в конец вектора numbers4 элементы из списка < 21, 22, 23 >numbers4.insert(iter4, < 21, 22, 23 >); //numbers4 = < 1, 2, 3, 4, 5, 21, 22, 23>;

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

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

std::vector v < 1,2,3,4 >; v.clear();

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

std::vector v < 1,2,3,4 >; v.pop_back(); // v =

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

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

std::vector numbers1 < 1, 2, 3, 4, 5, 6 >; auto iter = numbers1.cbegin(); // указатель на первый элемент numbers1.erase(iter + 2); // удаляем третий элемент // numbers1 = < 1, 2, 4, 5, 6 >std::vector numbers2 = < 1, 2, 3, 4, 5, 6 >; auto begin = numbers2.cbegin(); // указатель на первый элемент auto end = numbers2.cend(); // указатель на последний элемент numbers2.erase(begin + 2, end — 1); // удаляем с третьего элемента до последнего // numbers2 =

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

std::vector numbers3 < 1, 2, 3, 1, 5, 6 >; std::erase(numbers3, 1); // numbers3 =

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

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

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

#include #include int main() < std::vectornumbers; if(numbers.empty()) std::cout

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

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

std::vector numbers1 < 1, 2, 3, 4, 5, 6 >; numbers1.resize(4); // оставляем первые четыре элемента — numbers1 = numbers1.resize(6, 8); // numbers1 =

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

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

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

std::vector langs = < "Java", "JavaScript", "C">; langs.assign(4, «C++»); // langs =

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

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

std::vector langs< "Java", "JavaScript", "C">; langs.assign(< "C++", "C#", "C">); // langs =

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

std::vector clangs < "C++", "C#", "Java" >; std::vector ilangs < "JavaScript", "Python", "PHP">; clangs.swap(ilangs); // clangs = < "JavaScript", "Python", "PHP">; for(std::string lang : clangs)

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

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

std::vector v1 ; std::vector v2 ; std::vector v3 ; bool v1v2 = v1 == v2; // true bool v1v3 = v1 != v3; // true bool v2v3 = v2 == v3; // false

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *