在 stdvector 中查詢元素
<algorithm>
頭中定義的函式 std::find
可用於查詢 std::vector
中的元素。
std::find
使用 operator==
來比較元素的相等性。它將迭代器返回到範圍內的第一個元素,該元素與值相等。
如果找不到相關元素,std::find
將返回 std::vector::end
(如果向量為 const
則返回 std::vector::cend
)。
Version < C++ 11
static const int arr[] = {5, 4, 3, 2, 1};
std::vector<int> v (arr, arr + sizeof(arr) / sizeof(arr[0]) );
std::vector<int>::iterator it = std::find(v.begin(), v.end(), 4);
std::vector<int>::difference_type index = std::distance(v.begin(), it);
// `it` points to the second element of the vector, `index` is 1
std::vector<int>::iterator missing = std::find(v.begin(), v.end(), 10);
std::vector<int>::difference_type index_missing = std::distance(v.begin(), missing);
// `missing` is v.end(), `index_missing` is 5 (ie. size of the vector)
Version >= C++ 11
std::vector<int> v { 5, 4, 3, 2, 1 };
auto it = std::find(v.begin(), v.end(), 4);
auto index = std::distance(v.begin(), it);
// `it` points to the second element of the vector, `index` is 1
auto missing = std::find(v.begin(), v.end(), 10);
auto index_missing = std::distance(v.begin(), missing);
// `missing` is v.end(), `index_missing` is 5 (ie. size of the vector)
如果你需要在大型向量中執行許多搜尋,那麼在使用 binary_search
演算法之前,你可能需要先考慮對向量進行排序。
為了找到滿足條件的向量中的第一個元素,可以使用 std::find_if
。除了給 std::find
提供的兩個引數外,std::find_if
接受第三個引數,它是一個函式物件或指向謂詞函式的函式指標。謂詞應該接受容器中的元素作為引數,並返回一個可轉換為 bool
的值,而不修改容器:
Version < C++ 11
bool isEven(int val) {
return (val % 2 == 0);
}
struct moreThan {
moreThan(int limit) : _limit(limit) {}
bool operator()(int val) {
return val > _limit;
}
int _limit;
};
static const int arr[] = {1, 3, 7, 8};
std::vector<int> v (arr, arr + sizeof(arr) / sizeof(arr[0]) );
std::vector<int>::iterator it = std::find_if(v.begin(), v.end(), isEven);
// `it` points to 8, the first even element
std::vector<int>::iterator missing = std::find_if(v.begin(), v.end(), moreThan(10));
// `missing` is v.end(), as no element is greater than 10
Version >= C++ 11
// find the first value that is even
std::vector<int> v = {1, 3, 7, 8};
auto it = std::find_if(v.begin(), v.end(), [](int val){return val % 2 == 0;});
// `it` points to 8, the first even element
auto missing = std::find_if(v.begin(), v.end(), [](int val){return val > 10;});
// `missing` is v.end(), as no element is greater than 10