一 概述
C++ 標準庫中提供了很多算法,定義於頭文件 < algorithm >。本文主要探究以下用於 區間元素複製 的算法:
std::copy 將某一範圍的元素複製到一個新的位置
std::copy_if (C++11) 將某一範圍的滿足條件的元素複製到一個新的位置
std::copy_n (C++11) 將一定數目的元素複製到一個新的位置
std::copy_backyard 按從後往前的順序複製一個範圍內的元素
二 輔助函數
三 定義
template < class InputIt , class OutputIt >
OutputIt copy ( InputIt first, InputIt last, OutputIt d_first ) ;
template < class InputIt , class OutputIt , class UnaryPredicate >
OutputIt copy_if ( InputIt first, InputIt last, OutputIt d_first,
UnaryPredicate pred ) ; ( C++ 11 )
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 起)
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:: 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:: 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:: 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:: 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
五 參考