? ? find() 函数除了可以作用于序列式容器,还可以作用于普通数组。
? ? 代码示例:
vector<int> v1 = { 8, 3, 5, 4, 1, 6, 2 };
vector<int>::iterator it = find(v1.begin(), v1.end(), 6);
if (it != v1.end()) {
cout << "找到:" << *it << endl;
}
else {
cout << "没找到" << endl;
}
? ? 可以传入普通函数或函数对象,作为自定义查找规则。
? ? 代码示例:
//以函数对象的形式定义一个匹配规则
class compare {
public:
bool operator()(const int& i, const int& j) {
return (i % j == 0);
}
};
int main() {
vector<int> v1{ 2,4,6,4,8,12,18,1,2,3 };
int arr[] = { 2,4,6 };
vector<int>::iterator it = find_end(v1.begin(), v1.end(), arr, arr + 3, compare());
if (it != v1.end()) {
cout << "最后一个被{2,4,6}整除的起始位置为:" << it - v1.begin() << ",*it = " << *it;
}
return 0;
}
? ? ?可以传入普通函数或函数对象,作为自定义查找规则。
? ?? 代码示例:
vector<int> v1{ 1,2,3,4,1,2,3,8,1,2,3 };
int arr[] = { 1,2,3 };
vector<int>::iterator it = search(v1.begin(), v1.end(), arr, arr + 3);
if (it != v1.end()) {
cout << "第一个{1,2,3}的起始位置为:" << it - v1.begin() << ",*it = " << *it << endl;
}
? ??可以传入普通函数或函数对象,作为自定义查找规则。
? ? 代码示例:
vector<int> v1{ 1,2,3,4,6,6,6,8,1,2,6,6,6 };
vector<int>::iterator it = search_n(v1.begin(), v1.end(), 3, 6);//找{6,6,6}
if (it != v1.end()) {
cout << "第一个{6,6,6}的起始位置为:" << it - v1.begin() << endl;
}
? ??可以传入普通函数或函数对象,作为自定义查找规则。
? ??代码示例:
char a[] = "abcdefg";
char ch[] = "fc";
char* it = find_first_of(a, a + 7, ch, ch + 2);
if (it != a + 7) {
cout << "找到的第一个是:" <<*it<<",位置是:"<<it - a << '\n';
}
? ???传入普通函数或函数对象,作为自定义查找规则。
? ? ?代码示例:
class compare {
public:
bool operator()(const int& i) {
return ((i % 2) == 1);
}
};
int main() {
vector<int> v1{ 4,2,3,1,5 };
//查找第一个奇数
vector<int>::iterator it = find_if(v1.begin(), v1.end(), compare());
cout << "*it = " << *it<<endl;
//查找第一个非奇数
it = find_if_not(v1.begin(), v1.end(), compare());
cout << "*it = " << *it<<endl;
return 0;
}
? ? 可以传入普通函数或函数对象,作为自定义查找规则。
? ??代码示例:
std::vector<int> v1{ 5,6,6,3,2,1,2,2 };
auto it = adjacent_find(v1.begin(), v1.end());
if (it != v1.end()) {
cout << "找到: " << *it << endl;
}
else {
cout << "没找到. " << endl;
}
? ??可以传入普通函数或函数对象,作为自定义查找规则。
? ? 代码示例:
class AA
{
int m_v;
public:
AA(int v) :m_v(v) {
}
bool operator == (const AA& other)
{
return other.m_v == m_v;
}
};
int main() {
AA a(2);
std::vector<AA> v1{ 5,6,6,3,2,1,2,2 };
int num = count(v1.begin(), v1.end(), a);
cout << "对象AA(2)的个数:" <<num << endl;
return 0;
}
?? 关联式容器set、map自带成员函数count().
? ??可以传入普通函数或函数对象,作为自定义查找规则。
bool CompFind(int val)
{
return val == 6;
}
int main() {
std::vector<int> v1{ 5,6,6,3,2,1,2,2 };
int num = count_if(v1.begin(), v1.end(), [](int val) { return val == 2; });
cout << "数字2的个数:" <<num << endl;
int num2 = count_if(v1.begin(), v1.end(), CompFind);
cout << "数字6的个数:" << num2 << endl;
return 0;
}
? ? ? ? 仅适用于已排好序的序列。所谓“已排好序”,指的是查找区域内所有令 element<val(或者 comp(element,val),其中element 为指定范围内的元素)成立的元素都位于不成立元素的前面。
? ? ??使用此函数查找,最终找到的是大于或等于目标值的元素。
? ? ? 代码示例:
vector<int> v1{ 2,1,4,5,9,6,8 };
vector<int>::iterator it = lower_bound(v1.begin(), v1.end(), 3);
if (it != v1.end()) {
cout << "找到:" << *it;
}
? ? ? 代码示例:
vector<int> v1{ 2,1,4,5,9,6,8 };
vector<int>::iterator it = upper_bound(v1.begin(), v1.end(), 4);
if (it != v1.end()) {
cout << "找到:" << *it;
}
? ? ? ?实现调用的是lower_bound和upper_bound。
? ? ?? 代码示例:
class compare {
public:
bool operator()(const int& i, const int& j) {
return i > j;
}
};
int main() {
vector<int> v1{ 7,8,9,6,6,6,3,2,1,5,4 };
pair<vector<int>::iterator, vector<int>::iterator> range2;
//在容器中找到所有的元素6
range2 = equal_range(v1.begin(), v1.end(), 6, compare());
for (auto it = range2.first; it != range2.second; ++it) {
cout << *it << " ";
}
return 0;
}
? 说明:v1容器中存储的序列虽然整体是乱的,但对于目标元素 6?来说,所有符合 compare(element, 6) 规则的元素都位于其左侧,不符合的元素都位于其右侧,因此认为有序。
? ? ??实现调用的是lower_bound。
? ? ? 代码示例:
class compare {
public:
bool operator()(const int& i, const int& j) {
return i > j;
}
};
int main() {
vector<int> v1{ 6,4,5,1,2,0 };
//从容器查找元素 3
bool hasElem = binary_search(v1.begin(), v1.end(), 3, compare());
cout << "hasElem:" << hasElem;
return 0;
}