C++函数——fill
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvYzE5MzMzY2MxYzY1NDY5NWFkNzdhMWUzZGVjNjdkM2EuZ2lm在C++中,std::fill 是标准库提供的一个算法实用于险些全部范例的容器,只要这些容器支持迭代器利用。详细来说,std::fill 的实用性取决于容器是否提供了满意其要求的迭代器范例,用于将指定范围内的全部元素设置为某个特定值。它是一个范例安全的利用,非常得当对容器或数组中的元素举行初始化或赋值。
函数原型
std::fill 的函数原型界说在 <algorithm> 头文件中:
#include <algorithm>
template <typename ForwardIterator, typename T>
void fill(ForwardIterator first, ForwardIterator last, const T& value);参数分析
[*] first:指向目标范围的起始位置的迭代器。
[*] last:指向目标范围的竣事位置的迭代器。
[*] value:要赋给目标范围中每个元素的值。
功能
std::fill 会将 [first, last) 范围内的全部元素设置为 value。它会逐个调用元素的赋值利用符(operator=),因此可以安全地用于恣意范例(包罗根本数据范例、类对象等)。
使用示例
1. 初始化数组
#include <algorithm>
#include <iostream>
int main() {
int arr;
std::fill(arr, arr + 10, 42);// 将数组的每个元素设置为 42
for (int i = 0; i < 10; ++i) {
std::cout << arr << " ";
}
// 输出:42 42 42 42 42 42 42 42 42 42
return 0;
}2. 初始化标准库容器
#include <algorithm>
#include <vector>
#include <iostream>
int main() {
std::vector<int> vec(10);
std::fill(vec.begin(), vec.end(), 100);// 将 vector 的每个元素设置为 100
for (int i : vec) {
std::cout << i << " ";
}
// 输出:100 100 100 100 100 100 100 100 100 100
return 0;
}3. 初始化复杂对象
#include <algorithm>
#include <iostream>
struct Data {
int a;
double b;
Data(int x, double y) : a(x), b(y) {}
};
int main() {
Data arr;
std::fill(arr, arr + 5, Data(10, 3.14));// 将数组的每个元素初始化为 Data(10, 3.14)
for (const auto& d : arr) {
std::cout << "a: " << d.a << ", b: " << d.b << std::endl;
}
// 输出:
// a: 10, b: 3.14
// a: 10, b: 3.14
// ...
return 0;
}留意事项
[*] 范例安全:
[*] std::fill 是范例安全的,它会调用目标元素的赋值利用符,因此可以安全地用于复杂对象。
[*] 与 memset 差异,std::fill 不会粉碎对象的内部状态。
[*] 迭代器要求:
[*] std::fill 要求迭代器至少是正向迭代器(ForwardIterator),这意味着它支持单向遍历。因此,它实用于数组、std::vector、std::list 等容器。
[*] 性能:
[*] std::fill 的性能通常稍逊于 memset,由于它须要逐个调用赋值利用符。但对于复杂对象,这是唯一安全的方式。
[*] 与 std::fill_n 的区别:
[*] std::fill 利用的是一个范围 [first, last)。
[*] std::fill_n 利用的是从某个起始位置开始的 n 个元素。比方:
std::vector<int> vec(10);
std::fill_n(vec.begin(), 5, 42);// 从 vec.begin() 开始,填充 5 个元素为 42
总结
std::fill 是一个非常实用的算法,实用于须要对容器或数组中的元素举行初始化或赋值的场景。它完全范例安全,可以安全地用于恣意范例,包罗复杂对象。在C++中,发起优先使用 std::fill 或其他标准库算法,而不是直接利用内存(如 memset),除非须要高效处理处罚原始内存。
不实用的环境
固然 std::fill 非常通用,但以下环境大概须要留意:
[*] 容器为空:
[*] 假如容器为空(begin() == end()),std::fill 不会实行任何利用,但也不会报错。
std::vector<int> vec;
std::fill(vec.begin(), vec.end(), 42);// 无操作
[*] 容器不支持迭代器利用:
[*] 假如容器不提供迭代器(比方某些自界说容器或非标准库容器),则无法直接使用 std::fill。这种环境下,大概须要手动实现雷同的功能。
[*] 元素范例不支持赋值利用:
[*] 假如容器中的元素范例不支持赋值利用(比方某些不可赋值的类对象),则 std::fill 会报错。
class NonAssignable {
public:
NonAssignable() = default;
NonAssignable& operator=(const NonAssignable&) = delete;
};
std::vector<NonAssignable> vec(10);
std::fill(vec.begin(), vec.end(), NonAssignable());// 编译错误
总结
std::fill 是一个非常通用的算法,实用于险些全部支持迭代器利用的容器,包罗标准库容器(如 std::vector、std::array、std::list 等)和C风格数组。它完全范例安全,可以安全地用于恣意范例,包罗复杂对象。只要容器提供了正向迭代器,而且元素支持赋值利用,就可以使用 std::fill。
在实际使用中,std::fill 是一种非常保举的方式,由于它符合C++的范例安全原则,而且可以无缝集成到标准库的容器利用中。
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvOGU4YTcwNGNjNzYwNDcxNGEwNTkxNTY2NjRjYjc1YmQucG5n
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]