oj笔记(关于一些遇到的问题)

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;
}

参考文档

C++函数对象详解
http://c.biancheng.net/view/7213.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值