русс | укр

Мови програмуванняВідео уроки php mysqlПаскальСіАсемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование


Linux Unix Алгоритмічні мови Архітектура мікроконтролерів Введення в розробку розподілених інформаційних систем Дискретна математика Інформаційне обслуговування користувачів Інформація та моделювання в управлінні виробництвом Комп'ютерна графіка Лекції


Ітератори вставки


Дата додавання: 2014-04-22; переглядів: 918.


Деякі алгоритми, наприклад, 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(), доступ можливий лише до кінця такого контейнера.

 


<== попередня лекція | наступна лекція ==>
Спеціалізовані ітератори | Потокові ітератори


Онлайн система числення Калькулятор онлайн звичайний Науковий калькулятор онлайн