一、C++標準庫的查找
在C++的STL中,對容器或相關序列的查找中,有兩種方式,一種是std::find,另外一種是std::search。而且在它們的基礎上,還衍生出std::find_if、std::find_if_not、std::find_end等和std::search_n、ranges::search等。
既然都是查找,那么它們二者就會有共通之處更有不同之處,下面就對它們兩個進行分析說明。
二、適用場景
std::find和std::search都是用來查找,但適用的場景有所不同。std::find用于在STL容器中查找具體一個值而std::search用來在序列中查找連續的子序列。不過,二者都支持使用謂詞進行自定義的擴展,使得查找的應用更加靈活。
三、區別
std::find和std::search的區別主要包括:
1、std::find主要是查詢單個值,而std::search搜索一個序列
2、兩種查找的參數有所區別,前者查找值,后者查找一個范圍
3、std::find的時間復雜度是O(N)而std::search是O(M)~O((N-M+1)*M),其中 N 是主序列的長度,M 是子序列的長度
4、返回值有所不同,前者返回指針目標的迭代器,后者指向子序列起始位置的迭代器
四、例程
根據上面的說明,可結合下面的例程進行分析可以更清楚的明白其應用的情況:
//find
#include <vector>
#include <algorithm>std::vector<int> vec = {10, 17, 6, 53, 100};
auto it = std::find(vec.begin(), vec.end(), 53);// index:3
if (it != vec.end()) {std::cout << "value pos: " << std::distance(vec.begin(), it);
}//search
#include <vector>
#include <algorithm>std::vector<int> mSeq = {10, 17, 6, 53, 100,6,53};
std::vector<int> sSeq = {6, 53};auto it = std::search(mSeq.begin(), mSeq.end(), sSeq.begin(), sSeq.end());// index:2
if (it != mSeq.end()) {std::cout << "Subsequence pos: " << std::distance(mSeq.begin(), it);
}
五、總結
內容是比較簡單的,寫這個目的在于讓大家能夠有對比的進行學習和分析。這種學習方法在大家上學期間就知道的,應用到C++的編程學習中,也是非常適用的。正所謂,沒有對比就沒有傷害,沒有傷害就沒有記憶。雖然編程學習中對比可能沒有傷害,但的確可以增強學習的效率。與諸君共勉!