時刻提醒自己
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 輸出