C++11 算法 区间元素赋值

一 概述
  • C++ 标准库中提供了很多算法,定义于头文件 < algorithm >。本文主要探究以下用于 区间元素赋值 的算法:
    • std::fill 将一个给定值复制赋值给一个范围内的每个元素
    • std::fill_n 将一个给定值复制赋值给一个范围内的 n 个元素
    • std::generate 将相继的函数调用结果赋值给一个范围中的每个元素
    • std::generate_n 将相继的函数调用结果赋值给一个范围中的 n 个元素
    • std::iota(C++11) 用从起始值开始连续递增的值填充一个范围。注意头文件为 < numeric >
二 辅助函数
三 std::fill
  • 定义
template< class ForwardIt, class T >
void fill( ForwardIt first, ForwardIt last, const T& value );(1)(C++20)
template< class ForwardIt, class T >
constexpr void fill( ForwardIt first, ForwardIt last, const T& value );(1)(C++20)
template< class ExecutionPolicy, class ForwardIt, class T >
void fill( ExecutionPolicy&& policy, ForwardIt first, ForwardIt last, const T& value );(2)(C++17)
if (1) {
  // std::fill
  std::vector<int> vc(10);
  std::fill(vc.begin(), vc.end(), 9);
  print("after fill vc: ", vc);
}
  • 结果
after fill vc: 9 9 9 9 9 9 9 9 9 9
四 std::fill_n
  • 定义
template< class ForwardIt, class T >
void fill( ForwardIt first, ForwardIt last, const T& value );(1)(C++20)
template< class ForwardIt, class T >
constexpr void fill( ForwardIt first, ForwardIt last, const T& value );(1)(C++20)
template< class ExecutionPolicy, class ForwardIt, class T >
void fill( ExecutionPolicy&& policy, ForwardIt first, ForwardIt last, const T& value );(2)(C++17)
  • Demo
if (1) {
  // std::fill_n
  std::vector<int> vc(10);
  std::fill_n(vc.begin(), 5, 9);
  print("after fill_n vc: ", vc);
}
  • 结果
after fill_n vc: 9 9 9 9 9 0 0 0 0 0
五 std::generate
  • 定义
template< class ForwardIt, class Generator >
void generate( ForwardIt first, ForwardIt last, Generator g );(1)(C++20)
template< class ForwardIt, class Generator >
constexpr void generate( ForwardIt first, ForwardIt last, Generator g );(1)(C++20)
template< class ExecutionPolicy, class ForwardIt, class Generator >
void generate( ExecutionPolicy&& policy, ForwardIt first, ForwardIt last, 
               Generator g );(2)(C++17)
  • Demo
if (1) {
  // std::generate 将相继的函数调用结果赋值给一个范围中的每个元素
  std::vector<int> vc(10);
  int i = 100;
  std::generate(vc.begin(), vc.end(), [&i]() { return ++i; });
  print("after generate vc: ", vc);
}
  • 结果
after generate vc: 101 102 103 104 105 106 107 108 109 110
六 std::generate_n
  • 定义
template< class OutputIt, class Size, class Generator >
void generate_n( OutputIt first, Size count, Generator g );(1)(C++11)
template< class OutputIt, class Size, class Generator >
OutputIt generate_n( OutputIt first, Size count, Generator g );(1)(C++11)(C++20)
template< class OutputIt, class Size, class Generator >
constexpr OutputIt generate_n( OutputIt first, Size count, Generator g );(1)(C++20)
template< class ExecutionPolicy, class ForwardIt , class Size, class Generator >
ForwardIt generate_n( ExecutionPolicy&& policy, ForwardIt first, 
                      Size count, Generator g );(2)(C++17)
  • Demo
if (1) {
  // std::generate_n 将相继的函数调用结果赋值给一个范围中的 n 个元素
  std::vector<int> vc(10);
  int i = 100;
  std::generate_n(vc.begin(), 5, [&i]() { return ++i; });
  print("after generate_n vc: ", vc);
}
  • 结果
after generate_n vc: 101 102 103 104 105 0 0 0 0 0
七 std::iota(C++11)
  • 定义 (注意头文件为 < numeric >)
template< class ForwardIt, class T >
void iota( ForwardIt first, ForwardIt last, T value );(C++11)(C++20)
template< class ForwardIt, class T >
constexpr void iota( ForwardIt first, ForwardIt last, T value );(C++20)
  • Demo
if (1) {
  // std::iota(C++11) 用从起始值开始连续递增的值填充一个范围
  std::vector<int> vc(10);
  std::iota(vc.begin(), vc.end(), 100);  // #include <numeric>
  print("after iota vc: ", vc);
}
  • 结果
after iota vc: 100 101 102 103 104 105 106 107 108 109
八 参考
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值