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

八 参考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章