std::copy_n
来自 zh.cppreference.net
| 定义于头文件 <algorithm>
|
||
template< class InputIt, class Size, class OutputIt >
OutputIt copy_n( InputIt first, Size count, OutputIt result );
|
(1) | (自C++11起) (自C++20起为constexpr) |
template< class ExecutionPolicy,
class ForwardIt1, class Size, class ForwardIt2 >
ForwardIt2 copy_n( ExecutionPolicy&& policy,
ForwardIt1 first, Size count, ForwardIt2 result );
|
(2) | (自C++17起) |
1) 精确复制
count 个值,从范围起始于 first 到范围起始于 result。正式地,对于每个整数 i 在 [0, count) 中,执行 *(result + i) = *(first + i)。 范围的重叠在形式上是被允许的,但会导致结果的顺序不可预测。
2) 与 (1) 相同,但根据
policy 执行。 此重载仅当以下表达式的值为
true 时参与重载决议:
|
|
(至C++20) |
|
|
(自C++20起) |
参数
| first | - | 要从中复制元素的范围起始 |
| count | - | 要复制的元素数量 |
| result | - | 目标范围起始 |
| policy | - | 要使用的 执行策略 |
| 类型要求 | ||
-InputIt 必须满足 LegacyInputIterator 的要求。
| ||
-OutputIt 必须满足 LegacyOutputIterator 的要求。
| ||
-ForwardIt1, ForwardIt2 必须满足 LegacyForwardIterator 的要求。
| ||
返回值
目标范围内的迭代器,如果 count > 0 则指向最后一个被复制元素之后,否则指向 result。
复杂度
如果 count < 0 则为零次赋值;否则为 count 次赋值。
异常
带有模板参数名 ExecutionPolicy 的重载报告错误如下:
- 如果作为算法一部分调用的函数的执行抛出异常,并且
ExecutionPolicy是 标准策略 之一,则调用 std::terminate。对于任何其他ExecutionPolicy,行为由实现定义。 - 如果算法未能分配内存,则抛出 std::bad_alloc。
可能的实现
template<class InputIt, class Size, class OutputIt>
constexpr //< since C++20
OutputIt copy_n(InputIt first, Size count, OutputIt result)
{
if (count > 0)
{
*result = *first;
++result;
for (Size i = 1; i != count; ++i, (void)++result)
*result = *++first;
}
return result;
}
|
示例
运行此代码
#include <algorithm>
#include <iostream>
#include <iterator>
#include <numeric>
#include <string>
#include <vector>
int main()
{
std::string in {"1234567890"};
std::string out;
std::copy_n(in.begin(), 4, std::back_inserter(out));
std::cout << out << '\n';
std::vector<int> v_in(128);
std::iota(v_in.begin(), v_in.end(), 1);
std::vector<int> v_out(v_in.size());
std::copy_n(v_in.cbegin(), 100, v_out.begin());
std::cout << std::accumulate(v_out.begin(), v_out.end(), 0) << '\n';
}
输出:
1234
5050
另见
(C++11) |
复制元素范围到新位置 (函数模板 & 算法函数对象) |
(C++20)(C++20) |
|
(C++20) |
复制指定数量的元素到新位置 (算法函数对象) |