Функция copy в C++: легко и понятно!
Всем привет! Часто приходиться вывести некоторое количество элементов или добавить ячейки из одного контейнера в другой. Часто для это используется цикл for, но есть средство лучше - метод copy().
Что такое функция copy
copy - это метод который имеет четыре области применения.
- Первая - это выводить элементы от
n
-го итератора доj
. - Вторая - это добавлять элементы из контейнера A в контейнер B.
- Третья - это копирование диапазона ячеек и вставка его позицию X.
Эту функция поддерживают контейнеры: vector list set map
Как создать метод copy
copy(<первый>, <последний>, <операции>);
первый
ипоследний
- это диапазон ячеек к которым будут выполнятся операции.- В
операции
входит:
Вывод элементов
ostream_iterator - это итератор вывода. Он применяется для вывода элементов. Для оперирования этим итератором нужно подключить библиотеку - iterator
. Не поддерживает контейнер - map.
ostream_iterator<тип данных>(cout, "текст");
После ostream_iterator
должен стоять <тип данных>
выводимых элементов. Например - <int>
.
Разработчики сделали возможность выводить между элементами какую-то информацию - (cout, "ваш текст")
. В ваш текст
мы можем писать все что угодно, однако обычно там ставят пробел - " "
.
Вот так например мы смогли вывести весь список:
list <string> ilist;
ilist.push_back("мир!");
ilist.push_front("Привет ");
copy(ilist.begin(), ilist.end(), ostream_iterator<int>(cout," "));
Вот какой будет результат выполнения этой программы:
Привет мир!
Process returned 0 (0x0) execution time : 0.010 s
Press any key to continue.
Добавление элементов
inserter - специаль ный тип итератора вывода который добавляет элементы из контейнера A в контейнер B.
copy(<первый>,<последний>, inserter(<имя контейнера>, <итератор>));
После него не нужно указывать тип данных. Только понадобится в скобках написать, в какой контейнер и в какое его место будет идти добавление элементов.
map <string, int> map_first;
map <string, int> map_second;
map_first["code"]++;
map_first["lessons"]++;
copy(map_first.begin(), map_first.end(), inserter(map_second, map_second.begin()));
back_inserter - добавляет значения в конец STL контейнера.Не работает если третий аргумент указывает на map. Но работает c вектором пар (vector < pair <string, int> >
).
map <string, int> map_first;
vector < pair <string, int> > vec_pair;
copy(map_first.begin(), map_first.end(), back_inserter(vec_pair)); // работает!
front_inserter - добавляет элементы в начала контейнера.Не работает с map vector.
#include <iostream>
#include <list>
#include <set>
#include <iterator>
using namespace std;
int main() {
set <int> set_t;
set_t.insert(10);
set_t.insert(20);
set_t.insert(30);
list <int> digitals;
copy(set_t.begin(), set_t.end(), front_inserter(digitals));
copy(digitals.begin(), digitals.end(), ostream_iterator<int>(cout, " "));
system("pause");
return 0;
}
30 20 10
Process returned 0 (0x0) execution time : 0.010 s
Press any key to continue.
Копирование элементов
Для вставки копируемых элементов в контейнер нужно третьим аргументом передавать - итератор. От него начнут изменяться ячейки на значения другого контейнера. Не работает для set map.
copy(ilist.begin(), ilist.end(), ivec.begin());
Мы вставляем ячейки от начала контейнера -
ivec
.
В примере ниже мы изменим только вторую ячейку вектора answer
, хотя у вектора v
три ячейки.
#include <iostream>
#include <iterator> // для использования ostream_iterator
#include <vector>
using namespace std;
int main() {
setlocale(0, "");
vector <int> v; // создали два
vector <int> answer; // вектора
v.push_back(1);
v.push_back(2);
v.push_back(3);
answer.push_back(0);
answer.push_back(10);
cout << "вектор answer до использования copy: ";
copy(answer.begin(), answer.end(), ostream_iterator<int>(cout , " "));
cout << endl;
vector <int> :: iterator it = answer.begin(); // сделали итератор it который
it++; // указывает на начала answer
copy(v.begin(), v.end(), it); // изменили значения
cout << "вектор answer после оперирования методом copy: ";
copy(answer.begin(), answer.end(), ostream_iterator<int>(cout , " ")); // вывели все
// элементы
system("pause");
return 0;
}
Результат программы после запуска:
вектор answer до использования copy: 0 10
вектор answer после оперирования методом copy: 0 1
Process returned 0 (0x0) execution time : 0.010 s
Press any key to continue.
На этом все! Надеемся эта информация была для вас полезна. Если вы что-то не поняли или заметили в статье опечатку можете написать в комментарии. Удачи!
Если хотите всегда быть в курсе последних новостей в мире программирования и IT, подписываетесь на мой Telegram-канал, где я делюсь свежими статьями, новостями и полезными советами. Буду рад видеть вас среди подписчиков!
Обсуждение