Функция copy в C++: легко и понятно!

обложка статьи

Всем привет! Часто приходиться вывести некоторое количество элементов или добавить ячейки из одного контейнера в другой. Часто для это используется цикл for, но есть средство лучше - метод copy().

Интересное
Последние новости в мире программирования
Самые свежие новости и полезные материалы в моем telegram канале.
go

Что такое функция copy

copy - это метод который имеет четыре области применения.

  • Первая - это выводить элементы от n-го итератора до j.
  • Вторая - это добавлять элементы из контейнера A в контейнер B.
  • Третья - это копирование диапазона ячеек и вставка его позицию X.

Эту функция поддерживают контейнеры: vector list set map

Как создать метод copy

copy(<первый>, <последний>, <операции>);
  1. первый и последний - это диапазон ячеек к которым будут выполнятся операции.
  2. В операции входит:

Вывод элементов

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.
Интересное
Последние новости в мире программирования
Самые свежие новости и полезные материалы в моем telegram канале.
go

Добавление элементов

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.

На этом все! Надеемся эта информация была для вас полезна. Если вы что-то не поняли или заметили в статье опечатку можете написать в комментарии. Удачи!

« Итераторы в C++

Вектор в C++ »

Если хотите всегда быть в курсе последних новостей в мире программирования и IT, подписываетесь на мой Telegram-канал, где я делюсь свежими статьями, новостями и полезными советами. Буду рад видеть вас среди подписчиков!

Обсуждение