C++ STL-查找实例

find() find_if()

#if 0
/*查找-find find_if(1)*/
#include<iostream>
#include<functional>
#include<algorithm>
#include<list>
using namespace std;

template<typename Container>
void print(const Container &c);//模板函数

int main()
{
	list<int> a;
	for(int i=0;i<10;++i)
		a.insert(a.end(),i);
	for(int j=0;j<10;++j)
		a.insert(a.end(),j);
	print(a);

	//查找
	list<int>::iterator xc1;
	xc1=find(a.begin(),a.end(),6);//查找6
	list<int>::iterator xc2;//查找第二个
	if(xc2!=a.end())
	{
		xc2=find(++xc1,a.end(),6);//从找到第一个的地方开始找
	}
	if(xc1!=a.end()&&xc2!=a.end())
	{
		--xc1;
		++xc2;
		for(list<int>::iterator iter=xc1;iter!=xc2;++iter)
		{
			cout<<*iter<<" ";
		}
		cout<<endl;
	}
	return 0;
}

//display
template<typename Container>
void print(const Container &c)//模板函数
{
	Container::const_iterator i=c.begin();
	while(i!=c.end())
	{
		cout<<*i<<" ";
		++i;
	}
	cout<<endl;
}
#endif

#if 0
/*find find_if(2)*/
#include<iostream>
#include<vector>
#include<functional>
#include<algorithm>
using namespace std;

template<typename Container>
void print(const Container &c);//模板函数

int main()
{
	vector<int> a;
	vector<int>::iterator xc1;

	for(int i=1;i<=10;++i)
		a.push_back(i);
	print(a);

	xc1=find_if(a.begin(),a.end(),bind2nd(greater<int>(),3));//大于3的第一个数
	cout<<"number(>3):"<<*xc1<<endl;

	xc1=find_if(a.begin(),a.end(),not1(bind2nd(modulus<int>(),3)));//3的倍数
	cout<<"number(%3==0):"<<*xc1<<endl;
	return 0;
}

//display
template<typename Container>
void print(const Container &c)//模板函数
{
	Container::const_iterator i=c.begin();
	while(i!=c.end())
	{
		cout<<*i<<" ";
		++i;
	}
	cout<<endl;
}
#endif

使用成员函数

#if 0
#include<iostream>
#include<algorithm>
#include<set>
using namespace std;

template<typename Container>
void print(const Container &c);//模板函数

int main()
{
	set<int> a;
	a.insert(45);
	a.insert(32);
	a.insert(23);
	a.insert(4);
	a.insert(25);
	print(a);

	set<int>::iterator xc;
	xc=a.find(25);//成员函数
	if(xc!=a.end())
	{
		cout<<"success(25):"<<*xc<<endl;
	}
	else
	{
		cout<<"failed!!!"<<endl;
	}
	return 0;
}

//display
template<typename Container>
void print(const Container &c)//模板函数
{
	Container::const_iterator i=c.begin();
	while(i!=c.end())
	{
		cout<<*i<<" ";
		++i;
	}
	cout<<endl;
}
#endif

字符串查找

#if 0
/*字符串查找*/
#include<iostream>
#include<string>
using namespace std;

int main()
{
	string a("hellostring");
	string::size_type xc=a.find("llo");
	if(xc!=string::npos)
	{
		cout<<"success(index):"<<xc<<endl;
	}
	else
	{
		cout<<"failed!!!"<<endl;
	}
	return 0;
}
#endif

search_n()

#if 0
/*search_n*/
#include<iostream>
#include<deque>
#include<algorithm>
#include<functional>
using namespace std;

template<typename Container>
void print(const Container &c);//模板函数

int main()
{
	deque<int> a;
	for(int i=0;i<10;i++)
	{
		if(i==3)
		{
			a.push_back(i);
			a.push_back(i);
			a.push_back(i);
			a.push_back(i);//插入4个3
		}
		else
		a.push_back(i);//添加
	}
	print(a);

	//查找search_n
	deque<int>::iterator xc;
	xc=search_n(a.begin(),a.end(),2,3);//查找连续的2个3
	if(xc!=a.end())
	{
		cout<<"success(2,3):"<<*xc<<endl;//显示出第一个
		cout<<"index:"<<distance(a.begin(),xc)<<endl;//显示下标
	}
	else
	{
		cout<<"failed!!!"<<endl;
	}

	xc=search_n(a.begin(),a.end(),3,6,greater<int>());//连续三个>6的数Yes(指定标准时遗漏的错误,但可以运行)
	//xc=search_n_if(a.begin(),a.end(),3,bind2nd(greater<int>(),6));//标准写法No
	if(xc!=a.end())
	{
		cout<<"success(>6,3):"<<*xc<<endl;
		cout<<"index:"<<distance(a.begin(),xc+1)<<endl;
	}
	else
	{
		cout<<"failed!!!"<<endl;
	}
	return 0;
}

//display
template<typename Container>
void print(const Container &c)//模板函数
{
	Container::const_iterator i=c.begin();
	while(i!=c.end())
	{
		cout<<*i<<" ";
		++i;
	}
	cout<<endl;
}
#endif

search find_end

#if 0
/*search find_end*/
#include<iostream>
#include<algorithm>
#include<deque>
#include<list>
using namespace std;

template<typename Container>
void print(const Container &c);//模板函数

int main()
{
	//deque
	deque<int> de;//定义
	for(int i=0;i<8;++i)
		de.insert(de.end(),i);//插入
	for(int j=0;j<8;++j)
		de.insert(de.end(),j);
	for(int t=0;t<8;++t)
		de.insert(de.end(),t);
	cout<<"deque:"<<endl;
	print(de);

	//list
	list<int> li;
	for(int k=3;k<8;++k)
		li.insert(li.end(),k);
	cout<<"list:"<<endl;
	print(li);
	cout<<endl;

	//search
	deque<int>::iterator xcd;
	xcd=search(de.begin(),de.end(),li.begin(),li.end());//在de中查找li
	while(xcd!=de.end())//循环查找
	{
		cout<<"success:"<<*xcd<<endl;//找到的第一个数
		cout<<"index:"<<distance(de.begin(),xcd)<<endl;//下标
		cout<<endl;
		++xcd;
		xcd=search(xcd,de.end(),li.begin(),li.end());
	}
	/*if(xcd!=de.end())
	{
		cout<<"success:"<<*xcd<<endl;//找到的第一个数
		cout<<"index(1):"<<distance(de.begin(),xcd)<<endl;//下标
	}
	else
	{
		cout<<"failed!!!"<<endl;
	}

	//继续查找后面的
	cout<<endl;
	++xcd;
	xcd=search(xcd,de.end(),li.begin(),li.end());
	if(xcd!=de.end())
	{
		cout<<"success:"<<*xcd<<endl;//找到的第二个数
		cout<<"index(2):"<<distance(de.begin(),xcd)<<endl;//下标
	}
	else
	{
		cout<<"failed!!!"<<endl;
	}*/

	//find_end(查找最后一对)
	xcd=find_end(de.begin(),de.end(),li.begin(),li.end());
	if(xcd!=de.end())
	{
		cout<<"success:"<<*xcd<<endl;
		cout<<"index:"<<distance(de.begin(),xcd)<<endl;//下标
	}
	return 0;
}

//display
template<typename Container>
void print(const Container &c)//模板函数
{
	Container::const_iterator i=c.begin();
	while(i!=c.end())
	{
		cout<<*i<<" ";
		++i;
	}
	cout<<endl;
}
#endif

二元谓词

#if 0
/*二元谓词*/
#include<iostream>
#include<algorithm>
#include<vector>
#include<functional>
using namespace std;

template<typename Container>
void print(const Container &c);//模板函数
bool check(int elem,bool even);

int main()
{
	vector<int> a;
	for(int i=1;i<10;++i)
		a.push_back(i);
	print(a);
	//search
	bool checkVal[3]={false,true,false};//查找三个连续的奇数、偶数、奇数
	vector<int>::iterator xc;
	xc=search(a.begin(),a.end(),checkVal,checkVal+3,check);
	if(xc!=a.end())
	{
		//cout<<"success:"<<*xc<<endl;
		cout<<"index:"<<distance(a.begin(),xc)+1<<endl;
	}
	else
	{
		cout<<"failed!!!"<<endl;
	}
	return 0;
}

//display
template<typename Container>
void print(const Container &c)//模板函数
{
	Container::const_iterator i=c.begin();
	while(i!=c.end())
	{
		cout<<*i<<" ";
		++i;
	}
	cout<<endl;
}

bool check(int elem,bool even)
{
	if(even)
		return elem%2==0;
	else
		return even%2==1;
}
#endif

find_first_of

#if 0
/*find_first_of*/
#include<iostream>
#include<algorithm>
#include<vector>
#include<list>
#include<string>
using namespace std;

template<typename Container>
void print(const Container &c);//模板函数

int main()
{
	vector<int> ve;
	list<int> li;
	for(int i=1;i<12;++i)
		ve.push_back(i);

	li.push_back(3);
	li.push_back(6);
	li.push_back(9);
	cout<<"vector:"<<endl;
	print(ve);
	cout<<"list:"<<endl;
	print(li);
	cout<<endl;

	//查找,找到第一个就停下来了
	vector<int>::iterator xc;
	xc=find_first_of(ve.begin(),ve.end(),li.begin(),li.end());//在ve里查找li中的元素(&&),任意一个
	if(xc!=ve.end())
	{
		cout<<"success:"<<*xc<<endl;
		cout<<"index:"<<distance(ve.begin(),xc)<<endl;
	}
	else
	{
		cout<<"failed!!!"<<endl;
	}
	cout<<endl;

	//查找最后一个,逆向迭代器
	vector<int>::reverse_iterator rxc;
	rxc=find_first_of(ve.rbegin(),ve.rend(),li.begin(),li.end());
	if(rxc!=ve.rend())
	{
		cout<<"success:"<<*xc<<endl;
		cout<<"index:"<<distance(ve.begin(),rxc.base())<<endl;//需要将逆向迭代器转换为正向迭代器
	}
	else
	{
		cout<<"failed!!!"<<endl;
	}
	cout<<endl;

	//string find_first_of
	string str("0123456789");
	string str1("df45h7");
	string::size_type xc1=str1.find_first_of(str);//查找数字
	if(xc1!=string::npos)
	{
		cout<<"index:"<<xc1<<endl;
	}
	else
	{
		cout<<"failed!!!"<<endl;
	}
	//从后面查找
	xc1=str.find_last_of(str);
	if(xc1!=string::npos)
	{
		cout<<"index:"<<xc1<<endl;
	}
	else
	{
		cout<<"failed!!!"<<endl;
	}
	return 0;
}

//display
template<typename Container>
void print(const Container &c)//模板函数
{
	Container::const_iterator i=c.begin();
	while(i!=c.end())
	{
		cout<<*i<<" ";
		++i;
	}
	cout<<endl;
}
#endif

adiacent_find

#if 0
/*adjacent_find*/
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;

bool doubled(int elem1,int elem2);//谓词
template<typename Container>
void print(const Container &c);//模板函数

int main()
{
	vector<int> a;
	a.push_back(1);
	a.push_back(3);
	a.push_back(2);
	a.push_back(4);
	a.push_back(4);
	a.push_back(6);
	a.push_back(0);
	cout<<"a:"<<endl;
	print(a);
	cout<<endl;

	//adjacent查找
	vector<int>::iterator xc;
	xc=adjacent_find(a.begin(),a.end());//查找两个连续的相等的数
	if(xc!=a.end())
	{
		cout<<"success(index):"<<distance(a.begin(),xc)+1<<endl;
	}
	else
	{
		cout<<"failed!!!"<<endl;
	}
	cout<<endl;

	//使用谓词
	xc=adjacent_find(a.begin(),a.end(),doubled);
	if(xc!=a.end())
	{
		cout<<"success(index):"<<distance(a.begin(),xc)+1<<endl;
	}
	else
	{
		cout<<"failed!!!"<<endl;
	}
	return 0;
}

//display
template<typename Container>
void print(const Container &c)//模板函数
{
	Container::const_iterator i=c.begin();
	while(i!=c.end())
	{
		cout<<*i<<" ";
		++i;
	}
	cout<<endl;
}

bool doubled(int elem1,int elem2)
{
	return elem1*2==elem2;//第二个数是第一个数的两倍
}
#endif

lower_bound upper_bound equal_range

#if 0
/*lower_bound upper_bound equal_range*/
#include<iostream>
#include<algorithm>
#include<list>
using namespace std;

template<typename Container>
void print(const Container &c);//模板函数

int main()
{
	list<int> li;
	for(int i=1;i<10;++i)
		li.insert(li.end(),i);
	for(int j=1;j<10;++j)
		li.insert(li.end(),j);
	li.sort();//排序
	print(li);

	//lower_bound
	list<int>::iterator xc1,xc2;
	xc1=lower_bound(li.begin(),li.end(),5);//查找第一个5
	if(xc1!=li.end())
		cout<<"success(index):"<<distance(li.begin(),xc1)+1<<endl;//第一个5的位置
	else 
		cout<<"failed!!!"<<endl;
	cout<<endl;
	
	xc2=upper_bound(li.begin(),li.end(),5);//查找大于最后一个5的第一个位置
	if(xc2!=li.begin())
		cout<<"success(index):"<<distance(li.begin(),xc2)+1<<endl;
	else
		cout<<"failed!!!"<<endl;
	cout<<endl;
	
	//insert
	li.insert(lower_bound(li.begin(),li.end(),5),5);//insert 5
	li.insert(upper_bound(li.begin(),li.end(),5),5);//5
	print(li);
	cout<<endl;

	//equal_range
	pair<list<int>::iterator,list<int>::iterator> range;
	range=equal_range(li.begin(),li.end(),5);
		cout<<"success(index1):"<<distance(li.begin(),range.first)+1<<endl;
		cout<<"success(index2):"<<distance(li.begin(),range.second)+1<<endl;
	cout<<endl;
	return 0; 
}

//display
template<typename Container>
void print(const Container &c)//模板函数
{
	Container::const_iterator i=c.begin();
	while(i!=c.end())
	{
		cout<<*i<<" ";
		++i;
	}
	cout<<endl;
}
#endif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Swxctx

您的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值