[C++] : std::copy_n
std::copy_n
是 C++ 标准库中的一个算法,用于将指定数量的元素从一个输入范围复制到一个输出范围。那这就提供了很灵活的用法了。下面我们举例说明。
语法
template< class InputIt, class Size, class OutputIt >
OutputIt copy_n(InputIt first, Size count, OutputIt result);
InputIt
:表示输入范围的迭代器类型,指向要复制的起始位置。Size
:表示要复制的元素数量。OutputIt
:表示输出范围的迭代器类型,指向复制的目标位置。first
:指向输入范围中要复制的起始位置的迭代器。count
:要复制的元素数量。result
:指向输出范围中复制的目标位置的迭代器。
功能
std::copy_n
从输入范围[first, first + count)
复制count
个元素到输出范围[result, result + count)
。- 返回指向输出范围中最后一个复制元素之后的位置的迭代器。
示例一
#include <iostream>
#include <algorithm>
#include <vector>int main() {std::vector<int> source = {1, 2, 3, 4, 5};std::vector<int> destination(5);// 将 source 中的前三个元素复制到 destination 中auto it = std::copy_n(source.begin(), 3, destination.begin());// 输出复制后的 destinationfor (int num : destination) {std::cout << num << " ";}std::cout << std::endl;return 0;
}
输出
1 2 3 0 0
在这个示例中,std::copy_n
从 source
向量中复制了前三个元素到 destination
向量中。最后两个位置被填充为默认值 0。std::copy_n
返回指向输出范围中最后一个复制元素之后的位置的迭代器,这里没有使用返回值。
示例二
#include <algorithm>
#include <cstddef>
#include <iostream>
#include <iterator>
#include <fstream>struct MyLogSink { // (1)!void send(const char* base_filename, int line, const char* message, std::size_t message_len, std::ostream& os) {os << ' ' << base_filename << ':' << line << ' ';std::copy_n(message, message_len, std::ostreambuf_iterator<char>{os});os << '\n';}
};int main() {MyLogSink logSink;const char* filename = "example.cpp";int line = 42;const char* message = "This is a log message.";std::size_t message_len = std::strlen(message);// 输出到标准输出logSink.send(filename, line, message, message_len, std::cout);// 输出到日志文件std::ofstream logFile("log.txt", std::ios::app);if (logFile.is_open()) {logSink.send(filename, line, message, message_len, logFile);logFile.close();} else {std::cerr << "Unable to open log file" << std::endl;}return 0;
}
在这里,调用同一个接口send
,指定不同的输出对象,决定了是标准输出打印到控制台,还是写入到文件中(是不是灵光一闪,很方便进行输出重定向啊~~)