Пространства имён
Варианты
Действия

std::copy, std::copy_if

Материал из cppreference.com
< cpp‎ | algorithm
 
 
Алгоритмы
Функции
Немодифицирующие линейные операции
Модифицирующие линейные операции
Разделение
Сортировка (на отсортированных промежутках)
Бинарный поиск (на отсортированных промежутках)
Множества (на отсортированных промежутках)
Куча
Минимум/максимум
Числовые операции
Библиотека C
 
Определено в заголовочном файле <algorithm>
template< class InputIt, class OutputIt >
OutputIt copy( InputIt first, InputIt last, OutputIt d_first );
(1)
template< class InputIt, class OutputIt, class UnaryPredicate >

OutputIt copy_if( InputIt first, InputIt last,
                  OutputIt d_first,

                  UnaryPredicate pred );
(2) (начиная с C++11)

Копирует элементы диапазона [first, last) в диапазон, начинающийся с d_first. Второй вариант копирует только те элементы, для которых предикат pred возвращает true.

Содержание

[править] Параметры

first, last - диапазон копируемых элементов
d_first - Начало целевого диапазона. Если d_first находится внутри [first, last), вместо std::copy нужно использовать std::copy_backward
pred - унарный предикат, который возвращает​true для соответствующих элементов.

Определение функции предиката должны быть эквивалентно следующему:

 bool pred(const Type &a);

Определение не должно иметь const &, но функция не должна модифицировать принимаемые объекты.
Тип Type должен быть таков, что объект типа InputIt может быть разыменован и затем неявно преобразован в Type. ​

Требования к типам
-
InputIt должен соответствовать требованиям InputIterator.
-
OutputIt должен соответствовать требованиям OutputIterator.

[править] Возвращаемое значение

Output-итератор на элемент в целевом диапазоне, следующий сразу за последним скопированным элементом.

[править] Сложность

1) Ровно last - first присваиваний.

2) Ровно last - first применений предиката и не более last - first присваиваний.

[править] Примечания

На практике, если тип элементов диапазона является TriviallyCopyable, в реализации функции std::copy используется на оператор присваивания, а функция массового копирования, такая как std::memcpy.

[править] Возможная реализация

Первый вариант
template<class InputIt, class OutputIt>
OutputIt copy(InputIt first, InputIt last,
              OutputIt d_first)
{
    while (first != last) {
        *d_first++ = *first++;
    }
    return d_first;
}
Второй вариант
template<class InputIt, class OutputIt, class UnaryPredicate>
OutputIt copy_if(InputIt first, InputIt last,
                 OutputIt d_first, UnaryPredicate pred)
{
    while (first != last) {
        if(pred(*first))
            *d_first++ = *first;
         first++;
    }
    return d_first;
}

[править] Пример

Следующая программа использует функцию std::copy как для копирования содержания одного вектора в другой, так и для вывода на экран результирующего вектора:

#include <algorithm>
#include <iostream>
#include <vector>
#include <iterator>
 
int main()
{
    std::vector<int> from_vector;
    for (int i = 0; i < 10; i++) {
        from_vector.push_back(i);
    }
 
    std::vector<int> to_vector(10);
 
    std::copy(from_vector.begin(), from_vector.end(), to_vector.begin());
 
    std::cout << "to_vector содержит: ";
    std::copy(to_vector.begin(), to_vector.end(),
              std::ostream_iterator<int>(std::cout, " "));
    std::cout << std::endl;
}

Вывод:

to_vector содержит: 0 1 2 3 4 5 6 7 8 9

[править] См. также

копирует диапазон элементов в обратном порядке
Оригинал:
copies a range of elements in backwards order
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

(шаблон функции) [edit]
Копирует диапазон элементов опуская те, которые удовлетворяют определенным критериям
Оригинал:
copies a range of elements omitting those that satisfy specific criteria
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

(шаблон функции) [edit]