C++ find(STL find)查詢演算法詳解

2020-07-16 10:04:32
find() 為在輸入疊代器所定義的範圍內查詢單個物件的演算法,它可以在前兩個引數指定的範圍內查詢和第三個引數相等的第一個物件。

find 演算法會返回一個指向被找到物件的疊代器,如果沒有找到物件,會返回這個序列的結束疊代器。下面展示了如何使用 find():
std::vector<int> numbers {5, 46, -5, -6, 23, 17, 5, 9, 6, 5};
int value {23};
auto iter = std::find(std::begin(numbers), std::end(numbers), value);
if (iter != std:: end (numbers))
    std::cout << value << " was found. n";
這段程式碼會輸出一條在 numbers 中找到 23 的訊息,當然,可以反復呼叫 find() 來找出這個序列中所有給定元素的匹配項:
size_t count {};
int five {5};
auto start_iter = std::begin(numbers);
auto end_iter = std::end(numbers);
while((start_iter = std::find(start_iter, end_iter, five)) != end_iter)
{
    ++count;
    ++start_iter;
}
std::cout << five << " was found " << count << " times." << std::endl; // 3 times
在 while 迴圈中,count 變數會通過自增來記錄 five 在 vector 容器 numbers 中的發現次數。迴圈表示式呼叫 find(),在 start_iter 和 end_iter 定義的範圍內查詢 five。find() 返回的疊代器被儲存在 start_ter 中,它會覆蓋這個變數先前的值。最初,find() 會搜尋 numbers 中的所有元素,因此 find() 會返回一個指向 five 的第一個匹配項的疊代器。

每次找到 five,迴圈體中的startjter都會自增,因此它會指向被找到元素的後一個元素。所以,下一次遍歷搜尋的範圍是從這個位置到序列末尾。當不再能夠找到 five 時,find() 會返回 end_iter,迴圈結束。