C++初级代码(1.5)——模板的参数如果是函数指针一样可以简单代替,自己第一次用stl

template结构体传入的参数类型

代码如下:

模板类的形式类型参数T 个人理解可以和typedef相类似,,,
本来以为写类型参数T2的时候要像c语言那样类似一个函数的指针写出返回值和参数列表,结果发现想太多,完全不需要对类型做太多限制,这里c++范式编程的思想有所体现的感觉。(当然还是之前写过的小代码,直接贴在这里啦)

#include <iostream>
#include <cmath>
#include <algorithm>
#include <string>
using namespace std;
template <class T1,class T2>
struct Closer {
// 在此处补充你的代码
public:
    T1 n;
    T2 func;//不用再把模板这里写的非常复杂,只需要一个代号就可以。
    Closer(T1 _n, T2 f)//在这里传入类模板的类型也可以就是函数,比如这里的T2,就是用T2代表了复杂的函数指针类型!
    {
        n=_n;
        func=f;
    }
    bool operator ()(T1 a, T1 b)
    {
        if(func(a,n)<func(b,n)) return true;
        else if(func(a,n)==func(b,n)&&a<b) return true;
        else return false;
    }
};

int Distance1(int n1,int n2) {
	return abs(n1-n2);
}
int Distance2(const string & s1, const string & s2)
{
	return abs((int)s1.length()- (int) s2.length());
}
int a[10] = { 0,3,1,4,7,9,20,8,10,15};
string b[6] = {"American","Jack","To","Peking","abcdefghijklmnop","123456789"};
int main()
{
	int n;string s;
	while( cin >> n >> s ) {
		sort(a,a+10,Closer<int ,int (*)(int ,int)> (n,Distance1));
		for(int i = 0;i < 10; ++i)
			cout << a[i] << "," ;
		cout << endl;
		sort(b,b+6,Closer<string,int (*)(const string &,const string &  )> (s,Distance2));
		for(int i = 0;i < 6; ++i)
			cout << b[i] << "," ;
		cout << endl;
	}
	return 0;
}

在这里同时也记一下经验

在进行具体面对较小的变成问题的时候,没有必要总是以面向对象的方式进行编程,我们可以基于对象,甚至是c风格(当然其实这个就是为了做题)
比如曾经做过的郭炜老师mooc的题(第八周第七题set):
自己写的是这个样子的:

#include<string>
#include<iostream>
#include<vector>
#include<list>
#include<algorithm>
#include<fstream>
#include<windows.h>
using namespace std;//注,这个程序写的很慢,,,不如用大量空间换取时间方便,不要什么东西都面向对象,具体的题应该追求简介快速的代码
class MyList
{
public:
    int id;
    list<int> arr;

public:
    MyList(int i)
    {
        id=i;
    }

    MyList & add(int i)
    {
        arr.push_back(i);
        return *this;
    }
    MyList & Merge(MyList & A)
    {
        list<int> ::iterator p=A.arr.begin();
        arr.sort();
        A.arr.sort();
        arr.merge(A.arr);
        return *this;
    }
    MyList & Unique()
    {
        arr.sort();
        arr.unique();
        return *this;
    }
    void out()
    {
        arr.sort();
        list<int>::iterator p=arr.begin();
        for(;p!=arr.end();p++)
        {
            cout<<*p<<" ";
        }
        cout<<endl;
    }

};

class compare
{
public:
    int id;
    compare(int i):id(i){}
    bool operator()(MyList &A)
    {
        return A.id==id;
    }
};
bool check(const MyList &obj, ifstream &out)//用来检查数据的
{
    int right_num, num;
    list<int>::const_iterator it;
    for(it=(obj.arr).begin();it!=(obj.arr).end();it++)
    {
        out>>right_num;
        num = (*it);
        if(num==right_num) continue;
        else{
            cout<<"error id of "<<obj.id<<" in its element "<<num<<" right outpput: "<<right_num<<endl;
            system("pause");
            return false;
        }
    }
    return true;
}
int main(void)
{
    int n;
    cin>>n;
    vector<MyList> all;
    string com;
    ifstream ans("F:\\codeblocksusing\\bin\\Debug\\rightout.txt");
    while(n--)
    {

        cin>>com;
        if(com=="new")
        {
            int id;
            cin>>id;
            MyList  temp(id);
            all.push_back(temp);
        }
        else if(com=="add")
        {
            int id;
            int num;
            cin>>id>>num;
            vector<MyList>::iterator p;

            p=find_if(all.begin(),all.end(),compare(id));
            (*p).add(num);
        }
        else if(com=="merge")
        {
            vector<MyList>::iterator p1,p2,p;
            int id1,id2;
            int full=0;
            cin>>id1>>id2;
            for(p=all.begin();p!=all.end();p++)
            {
                if((*p).id==id1)
                {
                    full++;
                    p1=p;
                }

                if((*p).id==id2)
                {
                    full++;
                     p2=p;
                }
                if(full==2)
                break;
            }
            (*p1).Merge(*p2);
        }
        else if(com=="unique")
        {
            vector<MyList>::iterator p;
            int id;
            cin>>id;
            p=find_if(all.begin(),all.end(),compare(id));
            (*p).Unique();
        }
        else if(com=="out")
        {
            int id;
            vector<MyList>::iterator p;
            cin>>id;
            p=find_if(all.begin(),all.end(),compare(id));
            (*p).out();
           if(check(*p, ans)) cout<<"id "<<(*p).id<<" is correct"<<endl;
           else return -1;

        }
        else cout<<"Error, Something was wrong!"<<endl;

    }
    return 0;
}


这个代码写的很冗杂,而且速度很慢,,,
在这里不妨直接建立一个list的数组,(数组可以大一点,类比哈希搜索的思想,用空间换时间),
过得代码如下:

#include<iostream>
#include<vector>
#include<list>


using namespace std;

int main(void)
{
    int n;
    list<int> all[10000];//Óÿռ任ʱ¼ä
    string com;
    cin>>n;
    int id;
    int num;
    int id2;
    list<int> ::iterator it;


    while(n--)
    {
        cin>>com;
        switch((char)com[0])
        {
        case 'n':
            cin>>id;
            break;
        case 'a':

            cin>>id;
            cin>>num;
            all[id].push_back(num);
            break;
        case 'm':

            cin>>id>>id2;
            all[id].sort();
            all[id2].sort();
            all[id].merge(all[id2]);
            break;
        case 'u':
            cin>>id;
            all[id].sort();
            all[id].unique();
            break;
        case 'o':
            cin>>id;
            all[id].sort();
            for(it=all[id].begin();it!=all[id].end();it++)
            {
                cout<<*it<<" ";
            }
            cout<<endl;
            break;
        default:
            cout<<"Error!"<<endl;
            break;
        }

    }
    return 0;
}

可以发现速度快多了,可见stl有时候也要搭配得体才能保证完好。
注:尤其是关联容器,由于每次插入都自动排序,能少用尽量就少用(在对顺序的要求不高的情况下)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值