count 和 find 查找数组中有几个满足条件的指定元素
查找数组第一个指定条件的元素在哪里
这两个查找都是循序查找
| 查找返回满足条件的元素个数 | 查找返回满足条件的首个元素位置 |
|---|---|
| count(first,last,比较的值) | find(first,last,比较的值) |
| count_if(first,last,函数返回1则为满足) | find_if(first,last,函数返回1则满足) |
| 0 | find_first_of(v1.first,v1.last,v2.first,v2.last) |
| 二分查找的方法 | 返回的值 |
|---|---|
| binary_search(first,last,比较的值) | 在一个前闭后开的区间中查找是否有元素返回false true |
| lower_bound(first,last,比较的值) | 返回满足条件的值的位置,如果没有则返回第一个不小于value的值 |
| upper_bound | |
| equal_range |
int cmd(int x)
{
if (x >= 5) return 1;
else return 0;
}
int main()
{
vector<int> vi;
cout << "第一个vector数组vi的所有元素" << endl;
for (int i = 0; i < 10; i++)
{
vi.push_back(i+10);
cout << i+10 << " ";
}
cout << endl;
vector<int> vj{ 15,16,17 };
cout << "第二vector类型有数据 15 16 17 三个数据" << endl;
1 count函数 查找 等于 给定数的元素的个数
//count 在数组类型中查找 等于 给定数的元素的个数
int x = count(vi.begin(), vi.end(), 5);
cout << "数组vector中有几个5:" << x << "个" << endl; //输出有几个 5
2 //count_if 在数组类型中查找 满足自定义函数条件 的元素的个数
x = count_if(vi.begin(), vi.end(), cmd);
cout << "数组中有几个大于等于5的元素:" << x << "个" << endl; //输出有几个数大于等于 5
find函数查找给定数据出现的位置
1 //find 查找给定数据出现的位置
vector<int>::iterator fr = find(vi.begin(), vi.end(), 16); //输出vector数组中第一个等于6的元素
if (fr == vi.end()) cout << "没有这个数存在" << endl; //如果没有这个元素则 fr==vi.end()
else cout << "16这个数在数组中哪个位置出现:" << (fr - vi.begin()) << endl;
//输出的时候要 fr-vi.bgein() 才是当前元素
2 //find_if 查找满足条件的数据第一次出现的位置
fr = find_if(vi.begin(), vi.end(), cmd);
cout << "第一个大于等于5的数是数组中第" << fr - vi.begin() << "个" << endl;
3 //find_first_of 从第一个区间取一个数去第二个区间找相同,然后取第二个找相同,直到找到相同元素为止
fr = find_first_of(vi.begin(), vi.end(), vj.begin(), vj.end());
cout << "从第一个迭代区间取一个数,然后在后面的迭代区间比较,如果有相同的则返回位置" << endl;
cout << "如果取的第一个数没有找到相同,则取第二个数再去比较" << endl;
cout << "找到的相同的数是第" << endl;
cout << (fr - vi.begin()) << "个" << endl;
//find_end 第一个区间 第二个区间,在第一个区间找一个子序列 和第二个区间元素都相同
//并且找到的是最后一个元素相同的子序列
4 fr = find_end(vi.begin(), vi.end(), vj.begin(), vj.end());
cout << "第一个区间中从后往前,子序列和第二个区间元素相同的第一个元素在第一个数组中的第" << endl;
cout << fr - vi.begin() << "个" << endl;
1 //binary_search 在已排序的[first, last)中寻找元素value。如果[first, last)内有等价于value的元素,它会返回true,否则返回false,它不返回查找位置。
if (binary_search(vi.begin(), vi.end(), 20))
cout << "有20这个元素";
else cout << "没有20这个元素";
cout << endl;
lower_xxxx 二分法查找中的一些函数
//四个二分查找 使用之前要先排序
//binary_search 试图在已排序的[first, last)中寻找元素value。
1 //如果[first, last)内有等价于value的元素,它会返回true,否则返回false,它不返回查找位置。
cout << endl << "查找数组中有没有指定元素,有则返回1,,没有返回0" << endl;
if (binary_search(vi.begin(), vi.end(), 20)) cout << "找到了20这个元素" << endl;
else cout << "没有找到20这个元素" << endl;
2 //lower_bound 它试图在已排序的[first, last)中寻找元素value。
//如果[first, last)具有等价于value的元素,lower_bound返回一个iterator指向其中第一个元素。
//如果没有这样的元素存在,它便返回假设这样的元素存在的话,会出现的位置。即指向第一个不小于value的元素。
//如果value大于[first, last)的任何一个元素,则返回last。
cout << endl << "lower_bound函数,我也不知道有没有这个元素" << endl;
fr = lower_bound(vi.begin(), vi.end(), 15);
if (*fr != 15) cout << "找到了15这个元素,第一个不小于15的数在指针指向的位置"<<endl;
else cout << "找到了15这个元素" << endl;
3 //upper_bound 它试图在已排序的[first, last)中寻找value,返回可安插value的最后一个合适的位置。
//如果value存在,lower_bound 返回的是指向该元素的iterator。相较之下upper_bound并不这么做,它返回value可被安插的最后一个合适位置。
//如果value存在,那么它返回的iterator将指向value的下一个位置,而非value自身。
cout << endl << "upper_bound返回可以安插指定元素的第一位置" << endl;
fr = upper_bound(vi.begin(), vi.end(), 15);
if (fr != vi.end()) cout << "指针指向比15大的最小的数,在数组中第" << fr - vi.begin() << "个" << endl;
else cout << "指定元素比数组中的所有数都大" << endl;
4 //equal_range 的返回值本质上结合了 lower_bound和upper_bound两者的返回值。
//其返回值是一对iterator i 和 j, 其中i是value可安插的第一个位置,j则是value可安插的最后一个位置。
//可以推演出:[i,j)中的每个元素都等价于value,而且[i, j)是[first, last)之中符合上述性质的一个最大子区间。
//算法lower_bound返回该range的第一个iterator,
//算法upper_bound返回该range的past - the - end iterator,算法 equal_range 则是以 pair 的形式将两者都返回。
vector <int> vecInt;
pair<vector<int>::iterator, vector<int>::iterator> iter;
iter = equal_range(vi.begin(), vi.end(), 15);
cout << "第一个等于指定元素的值,指针指向这个值" << *iter.first << " 第一个比指定元素大的元素,指针指向这个值" << *iter.second << endl;
cout << "第一个等于指定元素的元素,是数组中第" << iter.first-vi.begin() << " 第一个比指定元素大的元素,指针指向这个值" << iter.second-vi.begin() << endl;
cout << endl << "------------------------------------------------------------------------------------------" << endl;
cout << "pr是一个指针,*pr是一个整数,pr-vi.begin()表示pr指向数组中第几个数"<<endl;
return 0;
}
这篇博客介绍了C++ STL中的查找功能,包括使用count和find来查找数组中满足条件的元素数量以及位置,同时探讨了二分法查找的相关函数,如lower_bound等,强调在使用二分查找前需要对数据进行排序。
671

被折叠的 条评论
为什么被折叠?



