Деякі алгоритми, наприклад, copy(), дуже люблять перезаписувати існуючі дані в контейнері призначення. Наприклад, так відбувається в програмі 15.22. В ній копіюється вміст однієї черги з двостороннім доступом в іншу.
#include<iostream>
#include<conio>
#include<deque>
#include<algorithm>
using namespace std;
int main()
{int arr1[]={1,3,5,7,9};
int arr2[]={2,4,6,8,10};
deque<int>d1;
deque<int>d2;
for(int j=0;j<5;j++)
{d1.push_back(arr1[j]);
d2.push_back(arr2[j]);
}
copy(d1.begin(),d1.end(),d2.begin());
for(int k=0;k<d2.size();k++)
cout<<d2[k]<<" ";
cout<<endl;
getch();
return 0;
}
Програма 15.22
В результаті виконання програми вміст d2 заміняється вмістом d1. Часто саме це й вимагається за логікою роботи програми, але інколи було б краще, коли б алгоритм copy() не перезаписував, а вставляв дані в контейнер. Такої поведінки алгоритму можна добитися за допомогою ітератора вставки. В нього є три цікаві інструменти:
• back_inserter, вставляє нові елементи в кінець
• front_inserter, вставляє нові елементи в початок
• inserter, вставляє елементи у вказане місце
Програма 15.23 показує, як здійснювати вставку в кінець контейнера.
//черги та ітератор вставки
#include<iostream>
#include<conio>
#include<deque>
#include<algorithm>
using namespace std;
int main()
{
int arr1[]={1,3,5,7,9};
int arr2[]={2,4,6};
deque<int>d1;
deque<int>d2;
for(int i=0;i<5;i++)
d1.push_back(arr1[i]);
for(int j=0;j<3;j++)
d2.push_back(arr2[j]);
//копіювати d1 в кінець d2
copy(d1.begin(),d1.end(),back_inserter(d2));
cout<<"\nd2: ";
for(int k=0;k<d2.size();k++)
cout<<d2[k]<<" ";
cout<<endl;
getch();
return 0;
}
Програма 15.23
Для вставки нових елементів в кінець використовується метод push_back(). При цьому нові елементи з вихідного контейнера d1 вставляються в кінець d2, після відповідних елементів. Контейнер d1 залишається без змін.
Якщо б ми вказали в програмі, що елементи слід вставляти в початок:
copy(d1.begin(),d1.end(),front_inserter(d2));
то нові елементи розмістилися б перед існуючими. Механізм, який стоїть за цим – це просто метод push_front(), який вставляє елементи в початок і «перевертає» їх порядок. Можна вставляти дані в довільне місце контейнера, використовуючи версію inserter ітератора. Наприклад, вставимо нові дані в початок d2:
copy(d1.begin(),d1.end(),inserter(d2,d2.begin()));
Першим параметорм inserter є ім’я контейнера, в який потрібно переносити елементи, другим – ітератор, що вказує позицію, починаючи з якої повинні вставлятися дані. Оскільки inserter використовує insert(), то порядок елементів не зміниться. Змінюючи другий параметр inserter, ми можемо вказати довільне місце контейнера.
Звернемо увагу на те, що front_inserter не може використовуватися з векторами, оскільки в них відсутній метод push_front(), доступ можливий лише до кінця такого контейнера.