C++ 算法 複製元素

一 概述

  • C++ 標準庫中提供了很多算法,定義於頭文件 < algorithm >。本文主要探究以下用於 區間元素複製 的算法:
    • std::copy 將某一範圍的元素複製到一個新的位置
    • std::copy_if(C++11) 將某一範圍的滿足條件的元素複製到一個新的位置
    • std::copy_n(C++11) 將一定數目的元素複製到一個新的位置
    • std::copy_backyard 按從後往前的順序複製一個範圍內的元素

二 輔助函數

三 定義

  • copy
template< class InputIt, class OutputIt >
OutputIt copy( InputIt first, InputIt last, OutputIt d_first );
  • copy_if
template< class InputIt, class OutputIt, class UnaryPredicate >
OutputIt copy_if( InputIt first, InputIt last, OutputIt d_first, 
                  UnaryPredicate pred );(C++11)
  • copy_n
template< class InputIt, class Size, class OutputIt >
OutputIt copy_n( InputIt first, Size count, OutputIt result );(1)(C++11)(C++20)
template< class InputIt, class Size, class OutputIt >
constexpr OutputIt copy_n( InputIt first, Size count, OutputIt result );(1)(C++20)
template< class ExecutionPolicy, class ForwardIt1, class Size, class ForwardIt2 >
ForwardIt2 copy_n( ExecutionPolicy&& policy, ForwardIt1 first, Size count, ForwardIt2 result );(2)(C++17)
  • copy_backward
template< class BidirIt1, class BidirIt2 >
BidirIt2 copy_backward( BidirIt1 first, BidirIt1 last, BidirIt2 d_last );(C++20)
template< class BidirIt1, class BidirIt2 >
constexpr BidirIt2 copy_backward( BidirIt1 first, BidirIt1 last, BidirIt2 d_last );(C++20)

四 Demo

  • 代碼
if (1) {
  // std::copy 將某一範圍的元素複製到一個新的位置
  std::list<int> l;
  std::vector<int> vc;
  fill(vc, 1, 9);

  print("before copy list: ", l);
  std::copy(vc.begin(), vc.end(), std::back_inserter(l));
  print("after copy list: ", l);
}

if (1) {
  // std::copy_if(C++11) 將某一範圍的滿足條件的元素複製到一個新的位置
  std::list<int> l;
  std::vector<int> vc;
  fill(vc, 1, 9);

  print("before copy_if list: ", l);
  std::copy_if(vc.begin(), vc.end(), std::back_inserter(l), even);
  print("after copy_if list: ", l);
}

if (1) {
  // std::copy_n(C++11) 將一定數目的元素複製到一個新的位置
  std::list<int> l;
  std::vector<int> vc;
  fill(vc, 1, 9);

  print("before copy_n list: ", l);
  std::copy_n(vc.begin(), 5, std::back_inserter(l));
  print("after copy_n list: ", l);
}

if (1) {
  // std::copy_backyard(C++11) 按從後往前的順序複製一個範圍內的元素
  std::list<int> l(10);
  std::vector<int> vc;
  fill(vc, 1, 9);

  print("before copy_backyard list: ", l);
  std::copy_backward(vc.begin(), vc.end(), l.end());
  print("after copy_backyard list: ", l);
}
  • 結果
before copy list:
after copy list: 1 2 3 4 5 6 7 8 9
before copy_if list:
after copy_if list: 2 4 6 8
before copy_n list:
after copy_n list: 1 2 3 4 5
before copy_backyard list: 0 0 0 0 0 0 0 0 0 0
after copy_backyard list: 0 1 2 3 4 5 6 7 8 9

五 參考

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