在 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