stl–vector应用实例
#include <iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<int> odd ;
vector<int> even;
bool _judge_odd( int a)
{
return (a%2==1);
}
void _print()
{
for(int i=0; i<odd.size(); i++)
{
cout<<odd[i];
}
/*使用 迭代器的方法进行
vector<int >iterator :: begin = odd.begin();
vector<int >iterator :: end = odd.end();
while(begin!=end){
遍历
}
*/
for(int i=0; i<even.size(); i++)
{
cout<<even[i];
}
}
int main()
{
int value;
for(int i =0; i<=9; i++)
{
cin>>value;
//输入变量
if(_judge_odd(value))
odd.push_back(value);
else
{
even.push_back(value);
}
}
sort(even.begin(),even.end(),greater<int>());
sort(odd.begin(),odd.end(),less<int>());
_print();
}
关于vector的补充内容:
一开始使用的代码是sort(odd.begin().odd.end(),less); 那么出错了。
下面给出sort的使用方法 :
#include <iostream> // std::cout
#include <algorithm> // std::sort
#include <vector> // std::vector
//以普通函数的方式实现自定义排序规则
bool mycomp(int i, int j) {
return (i < j);
}
//以函数对象的方式实现自定义排序规则
class mycomp2 {
public:
bool operator() (int i, int j) {
return (i < j);
}
};
int main() {
std::vector<int> myvector{ 32, 71, 12, 45, 26, 80, 53, 33 };
//调用第一种语法格式,对 32、71、12、45 进行排序
std::sort(myvector.begin(), myvector.begin() + 4); //(12 32 45 71) 26 80 53 33
//调用第二种语法格式,利用STL标准库提供的其它比较规则(比如 greater<T>)进行排序
std::sort(myvector.begin(), myvector.begin() + 4, std::greater<int>()); //(71 45 32 12) 26 80 53 33
//调用第二种语法格式,通过自定义比较规则进行排序
std::sort(myvector.begin(), myvector.end(), mycomp2());//12 26 32 33 45 53 71 80
//输出 myvector 容器中的元素
for (std::vector<int>::iterator it = myvector.begin(); it != myvector.end(); ++it) {
std::cout << *it << ' ';
}
return 0;
}
函数对象 : 如果一个类将()运算符重载为成员函数,这个类就称为函数对象类,这个类的对象就是函数对象。函数对象是一个对象,但是使用的形式看起来像函数调用,实际上也执行了函数调用,因而得名。
#include <iostream>
using namespace std;
class CAverage
{
public:
double operator()(int a1, int a2, int a3)
{ //重载()运算符
return (double)(a1 + a2 + a3) / 3;
}
};
int main()
{
CAverage average;
cout << average(3, 2, 3);
return 0;
}
queue的应用实例
/*
问题背景就是约瑟环问题 。
输入 n p m
有n个人 数到第p个人,之后数m数 此时这个人出去,之后从下面一个人开始计数数到m那么淘汰,重点思路就是如何模拟计数的这个过程,那么下面的思路就是直接使用push(front()) ,加到队列中,注意第二个while 循环
*/
#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
int main()
{
int n,p,m;
while(scanf("%d%d%d",&n,&p,&m)){
if(n==0&&m==0&&p==0){
break;
}
queue<int> children;
for( int i=1;i<=n;i++){
children.push(i);
}
for(int i=1;i<p;i++){
children.push(children.front());//将前面的进队
children.pop();
}
while(!children.empty()){
for(int i =1;i<m;i++){
children.push(children.front());
children.pop();
} // for m
if(children.size()==1){
printf("%d\n",children.front());
}
else {
printf("%d, ",children.front());
}
children.pop();
}
}
}
应用实例二:
/*
date : 2022.1.15
猫狗收容所
*/
#include<iostream>
#include<string>
#include<queue>
#include<cstdio>
using namespace std;
struct anim
{
int order; //顺序
int an_num;//表示是猫还是狗
};
int order_all=0;
queue<anim*>dog;
queue<anim*>cat;
queue<int>result;
void _my_printf()
{
int a=result.size();
for(int i=0; i<a; i++)
{
if(i==0)
{
cout<<result.front();
}
else
cout<<" "<<result.front();
result.pop();
}
}
void adopt(int an_num)
{
//
if(an_num==0)
{
//采用第一种方式
int a1=dog.front()->order;
int b1=cat.front()->order;
if(a1<b1)
{
int a=dog.front()->an_num;
// cout<<" dog is adopting "<<a<<endl;
result.push(a);
//cout<<"result is :"<<result.front()<<endl;
dog.pop();
}
else
{
int a=cat.front()->an_num;
//cout<<" cat is adopting "<<a<<endl;
result.push(a);
// cout<<"result is :"<<result.front()<<endl;
cat.pop();
}
}
else if(an_num==1)
{
if(!dog.empty())
{
int a=dog.front()->an_num;
//cout<<" cat is adopting "<<a<<endl;
result.push(a);
//cout<<"result is :"<<result.front()<<endl;
dog.pop();
}
}
else
{
if(!cat.empty())
{
int a=cat.front()->an_num;
//cout<<" cat is adopting "<<a<<endl;
result.push(a);
//cout<<"result is :"<<result.front()<<endl;
cat.pop();
}
}
}
void give_ani(int an_num)
{
if(an_num<0)
{
//猫
anim *cat_an=new anim();
cat_an->an_num=an_num;
cat_an->order=order_all;
cat.push(cat_an);
// cout<<" cat is giving number is"<<an_num<<" order is "<<order_all<<endl;
}
else
{
anim *dog_an=new anim();
dog_an->an_num=an_num;
dog_an->order=order_all;
dog.push(dog_an);
// cout<<"dog is giving number is "<<an_num<<"order is "<<order_all<<endl;
}
order_all++;
}
int main()
{
int number;
cin>>number;
int in_out;
int an_num;// 动物相关的东西
int method;//收养方式
while(number--)
{
scanf("%d%d",&in_out,&an_num);
if(in_out==2) //表示收养
{
adopt(an_num);
}
else
{
give_ani(an_num);
}
}
_my_printf();
}
kmp的应用实例
/*
假设存在一个子序列使得pattern[1,,k]到pattern[j-k+1,j]相等成立
k>=1,如果并不存在的话 ,尝试为1的情况边界为0时候说明第一个字符都不匹配所以模式以及pattern都移动
*/
#include<iostream>
#include<string>
#include<cstdio>
#include<cstring>
using namespace std;
const int MAXN=1000;
const int MAXM=1000;
int nextTable[MAXM];
int pattern[MAXM];
int text[MAXM];
void GetNextTable( int m)
{
//使用kmp方式
int j=0;
nextTable[j]=-1;
int i=nextTable[j];
while(j<m)
{
if(i==-1||pattern[j]==pattern[i]) // 模式串匹配的意思
{
i++;
j++;
nextTable[j]=i;
}
else
{
i=nextTable[i];
}
}
}
void KMP( int n, int m ) //长度分别为n ,m
{
int i=0;
int j=0;
while(i<n&&j<m)
{
if(j==-1||text[i]==pattern[j]) //当前的字符匹配成功!
{
i++;
j++;
}
else
{
j=nextTable[j];
}
}
if(j==m)
{
return i-j+1;
}
else
{
return -1;
}
}
int main()
{
int caseNumber;
scanf("%d",&caseNumber);
while(caseNumber--)
{
int n,m;
scanf("%d",&text[i]);
for(int i=0;i<n;i++)
{
scanf("%d",&text[i]);
}
for(int i=0;i<m;i++)
{
scanf("%d",&pattern[i]);
}
printf("%d\n",KMP(n,m));
}
return 0;
}