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有时候也要搭配得体才能保证完好。
注:尤其是关联容器,由于每次插入都自动排序,能少用尽量就少用(在对顺序的要求不高的情况下)