搜索与统计操作

1.find(beg,end,v)

:在[beg,end)区间查找值等于v的元素,找到返回对应的迭代器,否则返回end。

#include<bits/stdc++.h>
using namespace std;
int main(){
	int *tp;
	int a[4]={3,4,5,17};
	vector<int> b={7,8,8,8};
	
	tp=find(a,a+4,22);
	cout<<tp-a<<endl; //输出位置 
	if(tp==a+4)	cout<<"can't find"<<endl; //找不到就返回最后一个位置 
	else	cout<<(*tp)<<endl; //输出元素 
	
	auto it=find(b.begin(),b.end(),8);
	cout<<it-b.begin()<<endl; //返回第一个位置 
	if(it!=b.end())	cout<<*it<<endl;
	else cout<<"can't find"<<endl;
	
	return 0;
}


2.find_first_of(beg,end,beg2,end2  /*,cmp*/)   find_end

:在区间[beg,end)和[beg2,end2)找元素匹配的,返回第一个位置的迭代器,默认相同元素,也可以自定义cmp

#include<bits/stdc++.h>
using namespace std;
bool cmp(string x,string y){  //自定义 
	if(x=="tdd")	return true;
	else	return false;
} 
int main(){
	vector<string> v1={"ab","cd","ccc","abcdfg","tdd"};
	vector<string> v2={"cd","tdd","tttt"};
	auto it=v1.begin(); //返回相匹配元素的迭代器 
	while((it=find_first_of(it,v1.end(), v2.begin(),v2.end()/*,cmp */))!=v1.end()){
		cout<<*it<<" ";
		it++;
	}
	return 0;
}

//find_end 与find_first_of 相同不过是返回最后一个 

3.search(beg,end,beg2,end2)

:在区间[beg,end)中查找[beg2,end2)子序列,返回第一个迭代器。

#include<bits/stdc++.h>
using namespace std;
int main(){
	vector<int> a={1,2,3,4,7,8,9};
	vector<int> b={3,4,7};
	auto it=search(a.begin(),a.end(),b.begin(),b.end());
	cout<<it-a.begin()<<endl; 
	//找到b中元素在a中第一次出现的位置,找不到返回end() 
	
	return 0;
} 

4.search_n(beg,end,n,v)

:在区间[beg,end)查找连续的n个v,返回第一个位置的迭代器。

#include<bits/stdc++.h>
using namespace std;
int main(){
	vector<int> a={1,2,3,7,7,8,9};
	auto it=search_n(a.begin(),a.end(),2,7); //查询2个7 
	cout<<it-a.begin()<<endl;
	return 0;
}

5.count(beg,end,v)

:在区间[beg,end)查询等于v的个数,v也可以换成cmp自定义。

#include<bits/stdc++.h>
using namespace std;
bool cmp(int x){
	if(x&1)	return true;
	else	return false;
}
int main(){
	vector<int> a={1,2,3,1,7,8,1};
	cout<<count(a.begin(),a.end(),1)<<endl;
	cout<<count_if(a.begin(),a.end(),cmp)<<endl;
	return 0;
}

6.lower_bound(beg,end,v)   upper_bound(beg,end,v)

:lower_bound返回第一个大于等于v的迭代器,upper_bound返回第一个大于v的迭代器,找不到返回end。

#include<bits/stdc++.h>
using namespace std;
int main() {
	int b[5]= {1,2,2,2,5};
	vector<int> a(b,b+5);
	vector<int>::iterator it1,it2;
	int s=lower_bound(b,b+5,2)-b;
	int e=upper_bound(b,b+5,7)-b;//找不到就返回最后一个位置
	cout<<s<<" "<<e<<endl;

	it1=lower_bound(a.begin(),a.end(),2);
	cout<<*it1<<endl;//it1是第一个大于或等于2的位置
	it2=upper_bound(a.begin() ,a.end(),2);
	cout<<*it2<<endl;//it2是第一个大于2的位置
	cout<<it2-it1<<endl;
	return 0;
}

 

持续更新(希望各位大佬评论补充,或是STL好用的东西)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值