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

八 參考

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