std::copy, std::copy_if

来自cppreference.com
< cpp‎ | algorithm

 
 
算法库
执行策略 (C++17)
不修改的序列操作
(C++11)
(C++11)
(C++11)
(C++17)
修改的序列操作
copycopy_if

(C++11)
(C++11)
(C++11)

未初始化存储上的操作
划分操作
排序操作
(C++11)
二分查找操作
集合操作(在已排序范围上)
堆操作
(C++11)
最小/最大操作
(C++11)
(C++17)

重排
数值操作
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.
原文:
Copies the elements in the range, defined by [first, last), to another range beginning at d_first. The second function only copies the elements for which the predicate pred returns true.
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。

目录

[编辑] 参数

first, last -
元素的范围内,要复制的复本
原文:
the range of elements to copy
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。
d_first -
的目标范围的开头。如果d_first[first, last)std::copy_backward必须使用代替std::copy.
原文:
the beginning of the destination range. If d_first is within [first, last), std::copy_backward must be used instead of std::copy.
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。
pred -
所需的元素
原文:
for the required elements
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。
则返回 true 的一元谓词。

谓词函数签名应等价于如下者:

 bool pred(const Type &a);

签名不必拥有 const & ,但函数必须不修改传递给它的对象。
类型 Type 必须使得 InputIt 类型对象能在解引用后隐式转换到 Type 。 ​

类型要求
-
InputIt 必须满足 InputIterator 的要求。
-
OutputIt 必须满足 OutputIterator 的要求。

[编辑] 返回值

输出迭代器在目标范围内的元素,复制过去的最后一个元素.
原文:
Output iterator to the element in the destination range, one past the last element copied.
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。

[编辑] 复杂度

1)
究竟last - first任务
原文:
Exactly last - first assignments
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。
2)
究竟last - first的谓词中的应用
原文:
Exactly last - first applications of the predicate
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。

[编辑] 注释

在实践中,实现std::copy避免多次分配和使用大容量复制功能,如std::memcpy如果该值类型是TriviallyCopyable
原文:
In practice, implementations of std::copy avoid multiple assignments and use bulk copy functions such as std::memcpy if the value type is TriviallyCopyable
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。

[编辑] 可能的实现

版本一
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;
}

[编辑] 示例

下面的代码复制到一个向量和显示的内容都复制得到的载体
原文:
The following code uses copy to both copy the contents of one vector to another and to display the resulting vector:
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。

#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 contains: ";
    std::copy(to_vector.begin(), to_vector.end(), 
              std::ostream_iterator<int>(std::cout, " "));
    std::cout << std::endl;
}

输出:

to_vector contains: 0 1 2 3 4 5 6 7 8 9

[编辑] 另请参阅

按从后往前的顺序复制一个范围内的元素
(函数模板) [编辑]
复制一个范围内不满足特定条件的元素
(函数模板) [编辑]