c++11之find 和 find_if 和 find_if_not 用法


時刻提醒自己

Note: vector的釋放

0.頭文件

#include <algorithm>

1.區別

返回范圍 [first, last) 中滿足特定判別標准的首個元素:

函數 功能
find 搜索等於 value 的元素
find_if 根據指定的查找規則,在指定區域內查找第一個符合該函數要求(使函數返回 true)的元素
find_if_not 如果查找成功,該迭代器指向的是查找到的那個元素;反之,如果查找失敗,該迭代器的指向和 last 迭代器相同

2.原型

2.1 find 原型

template< class InputIt, class T >
 InputIt find( InputIt first, InputIt last, const T& value );
  (C++20 前) 

template< class InputIt, class T >
constexpr InputIt find( InputIt first, InputIt last, const T& value );
  (C++20 起) 


template< class ExecutionPolicy, class ForwardIt, class T >
 ForwardIt find( ExecutionPolicy&& policy, ForwardIt first, ForwardIt last, const T& value ); 

2.2 find_if 原型


template< class InputIt, class UnaryPredicate >
InputIt find_if( InputIt first, InputIt last,
                 UnaryPredicate p );  (C++20 前) 


template< class InputIt, class UnaryPredicate >
constexpr InputIt find_if( InputIt first, InputIt last,

                           UnaryPredicate p );  (C++20 起) 


template< class ExecutionPolicy, class ForwardIt, class UnaryPredicate >
ForwardIt find_if( ExecutionPolicy&& policy, ForwardIt first, ForwardIt last,
                 UnaryPredicate p ); 

2.3 find_if_not 原型

template< class InputIt, class UnaryPredicate >
InputIt find_if_not( InputIt first, InputIt last,
                     UnaryPredicate q );  (C++11 起)
(C++20 前) 

template< class InputIt, class UnaryPredicate >
constexpr InputIt find_if_not( InputIt first, InputIt last,
                               UnaryPredicate q );  (C++20 起) 


template< class ExecutionPolicy, class ForwardIt, class UnaryPredicate >
ForwardIt find_if_not( ExecutionPolicy&& policy, ForwardIt first, ForwardIt last,
                     UnaryPredicate q ); 

3.參數

參數 解釋
first, last 要檢驗的元素范圍
value 要與元素比較的值
p 若為要求的元素則返回 ​true 的一元謂詞。對每個(可為 const 的) VT 類型參數 v ,其中 VT 是 InputIt 的值類型,表達式 p(v) 必須可轉換為 bool ,無關乎值類別,而且必須不修改 v 。從而不允許 VT& 類型參數,亦不允許 VT ,除非對 VT 而言移動等價於復制 (C++11 起)。
q 若為要求的元素則返回 ​false 的一元謂詞。對每個(可為 const 的) VT 類型參數 v ,其中 VT 是 InputIt 的值類型,表達式 q(v) 必須可轉換為 bool ,無關乎值類別,而且必須不修改 v 。從而不允許 VT& 類型參數,亦不允許 VT ,除非對 VT 而言移動等價於復制 (C++11 起)。 ​

4.異常

A. 若作為算法一部分調用的函數的執行拋出異常,且 ExecutionPolicy 為標准策略之一,則調用 std::terminate 。對於任何其他 ExecutionPolicy ,行為是實現定義的。
B. 若算法無法分配內存,則拋出 std::bad_alloc 

5.find用法

5.1 代碼

// 分數
std::vector<int> score{ 10, 20, 30, 40 };

// 待查找key
int find_key_10 = 10;
// 找一個存在於數組中的元素
auto ret_val_1 = std::find(score.begin(), score.end(), find_key_10);

if (score.end() != ret_val_1)
	std::cout << "找到了 10 了\n\n";
else
	std::cout << "沒有找到 10\n\n";

// 找一個不在數組中的元素
int find_key_50 = 50;
auto ret_val_2 = std::find(score.begin(), score.end(), find_key_50);

if (score.end() != ret_val_2)
	std::cout << "找到了 50 了\n\n";
else
	std::cout << "沒有找到 50\n\n";

5.2 輸出

6.find_if 用法

6.1 代碼

// 分數
std::vector<int> score{ 10, 20, 30, 40 };

// 找首個出現的,且大於30的元素
auto it = std::find_if(score.begin(), score.end(), [](const int &item) {return 30 < item; });

if (score.end() != it)
	std::cout << "找到了大於30的元素: " << *it << std::endl;
else
	std::cout << "沒有找到大於30的元素\n";

6.2 輸出

7.find_if_not 用法

7.1 代碼

// 分數
std::vector<int> score{ 10, 20, 30, 40 };

// 找首個出現的,且不大於30的元素
auto it = std::find_if_not(score.begin(), score.end(), [](const int &item) {return 30 < item; });

if (score.end() != it)
	std::cout << "找到了首個不大於30的元素: " << *it << std::endl;
else
	std::cout << "沒有找到不大於30的元素\n";

7.2 輸出


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM