泛型設(shè)計的思路:
泛型設(shè)計的產(chǎn)生是為了解決 把相同的類或者模板類之間有相似的方法 函數(shù) 抽象出來
就是對算法的抽象 ? 迭代器的出現(xiàn) 是為了讓抽象后的算法能能夠訪問不同類的內(nèi)部數(shù)據(jù)
而出來的概念
函數(shù)對象可以理解為 對某一算法的進(jìn)一步限制提出要求
1.容器
(1)vector ?有點類似 動態(tài)數(shù)組
#include
#include//vector
#include//迭代器
#include//算法
#include//函數(shù)對象
using namespace std;
void main()
{
int a[] = {1,5,3,4,2};
vector v(a,a+5);//vector的構(gòu)造
// for(int i = 0;i<5;i++)
// cout<
vector::iterator itr;//聲明vector迭代器
for(itr = v.begin();itr < v.end();itr++)
cout<<*itr<<" ";//通過迭代器遍歷
cout<
cout<
cout<
//訪問分為順序訪問和隨機(jī)訪問? 不是所有的容器都有隨機(jī)訪問
cout<
v.push_back(100);//在vector尾部插入100
for(itr = v.begin();itr < v.end();itr++)
cout<<*itr<<" ";//通過迭代器遍歷
}
注意頭文件的使用
(2)stack
#include
#include
#include
#include
#include
using namespace std;
//棧先進(jìn)后出
void main()
{
int a;
stack s;
for(int i = 0;i<5;i++)
{
cin>>a;
s.push(a);//壓棧
}
cout<
//for( i = 0;i<5;i++)
// cout<
for( i = 0;i<5;i++)
s.pop();//出棧
cout<
}
(3).queue
#include
#include
#include
#include
#include
using namespace std;
//隊列先進(jìn)先出
void main()
{
int a;
queue q;
for(int i = 0;i < 5;i++)
{
cin>>a;
q.push(a);
}
cout<
cout<
for( i = 0;i < 5;i++)
{
q.pop();
}
cout<
}
(4)string
#include
#include
#include
#include
#include
using namespace std;
void main()
{
string s1 ="hello",s2("nihao");
cout<
cout<
for(int i = 0;s1[i]!=NULL;i++)
cout<
cout<
cout<
string s3 = s1 + s2;
cout<
s3 += s1;
cout<
cout<
cout<<(s1 == s2)<
cout<<(s2 != s1)<
cout<<(s3 > s1)<
cout<<(s3 < s1)<
cout<<(s1 >= s2)<= nihao 返回0
cout<<(s1 <= s2)<
}
2.迭代器
vector::iterator itr;//聲明vector迭代器
for(itr = v.begin();itr < v.end();itr++)
cout<<*itr<<" ";//通過迭代器遍歷
3.算法
#include
#include
#include
#include
#include
using namespace std;
void main()
{
int a[] = {1,5,3,4,2};
vector v(a,a+5);//vector的構(gòu)造
// for(int i = 0;i<5;i++)
// cout<
vector::iterator itr;//聲明vector迭代器
for(itr = v.begin();itr < v.end();itr++)
cout<<*itr<<" ";//通過迭代器遍歷
cout<
cout<
cout<
//訪問分為順序訪問和隨機(jī)訪問? 不是所有的容器都有隨機(jī)訪問
cout<
v.push_back(100);//在vector尾部插入100
for(itr = v.begin();itr < v.end();itr++)
cout<<*itr<<" ";//通過迭代器遍歷
cout<
sort(v.begin(),v.end());
for(itr = v.begin();itr < v.end();itr++)
cout<<*itr<<" ";
}
對 ?vector 可以 sort()
sort(v.begin(),v.end());
for(itr = v.begin();itr < v.end();itr++)
cout<<*itr<<" ";//這個默認(rèn)是從小到大排? 要它從大到小排要加函數(shù)對象
對string 也可以sort()
sort(s1.begin(),s1.end());
cout<
find方法
int *pos = find(v.begin(),v.end(),3);
if(pos == v.end())
cout<<"Not Found"<
else
cout<<"index = "<
find_if方法
int isodd(int x)
{
return x%2;
}
cout<<*(find_if(v.begin(),v.end(),isodd));//按照isodd的規(guī)則查找 ?找到第一個滿足的元素就返回了
count 和 count_if
int b = count(v.begin(),v.end(),3);
cout<
cout<
b = count_if(v.begin(),v.end(),isodd);
cout<
4.函數(shù)對象
(1)普通函數(shù)
#include
#include
#include
#include
#include
using namespace std;
int isbigger(int a,int b)
{
return (a>b);
}
void main()
{
int a[] = {1,5,3,4,2};
vector v(a,a+5);//vector的構(gòu)造
// for(int i = 0;i<5;i++)
// cout<
vector::iterator itr;//聲明vector迭代器
for(itr = v.begin();itr < v.end();itr++)
cout<<*itr<<" ";//通過迭代器遍歷
cout<
cout<
cout<
//訪問分為順序訪問和隨機(jī)訪問? 不是所有的容器都有隨機(jī)訪問
cout<
v.push_back(100);//在vector尾部插入100
for(itr = v.begin();itr < v.end();itr++)
cout<<*itr<<" ";//通過迭代器遍歷
cout<
sort(v.begin(),v.end(),isbigger);
for(itr = v.begin();itr < v.end();itr++)
cout<<*itr<<" ";
}
函數(shù)對象
int isbigger(int a,int b)
{
return (a>b);
}
調(diào)用方法
sort(v.begin(),v.end(),isbigger);
for(itr = v.begin();itr < v.end();itr++)
cout<<*itr<<" ";
(2)類
#include
#include
#include
#include
#include
using namespace std;
int isbigger(int a,int b)
{
return (a>b);
}
class Big
{
public:
int operator()(int a,int b)
{
return (a>b);
}
};
void main()
{
int a[] = {1,5,3,4,2};
vector v(a,a+5);//vector的構(gòu)造
// for(int i = 0;i<5;i++)
// cout<
vector::iterator itr;//聲明vector迭代器
for(itr = v.begin();itr < v.end();itr++)
cout<<*itr<<" ";//通過迭代器遍歷
cout<
cout<
cout<
//訪問分為順序訪問和隨機(jī)訪問? 不是所有的容器都有隨機(jī)訪問
cout<
v.push_back(100);//在vector尾部插入100
for(itr = v.begin();itr < v.end();itr++)
cout<<*itr<<" ";//通過迭代器遍歷
cout<
sort(v.begin(),v.end(),isbigger);
for(itr = v.begin();itr < v.end();itr++)
cout<<*itr<<" ";
cout<
sort(v.begin(),v.end(),Big());
for(itr = v.begin();itr < v.end();itr++)
cout<<*itr<<" ";
}
函數(shù)對象
class Big
{
public:
int operator()(int a,int b)
{
return (a>b);
}
};
調(diào)用方法
sort(v.begin(),v.end(),Big());
for(itr = v.begin();itr < v.end();itr++)
cout<<*itr<<" ";
最后用一個復(fù)數(shù)類來解決
注意 函數(shù)對象要能訪問到類的數(shù)據(jù)要用到 友元函數(shù) 或者友元類
#include
#include
#include
#include
#include
#include
#include
using namespace std;
class Complex;
ostream operator<<(ostream& out,const Complex& c);
istream& operator>>(istream& in,Complex& c);
Complex Add(const int a,const Complex &c1);
Complex Jian(const int a,const Complex &c1);
Complex Chen(const int a,const Complex &c1);
Complex Chu(const int a,const Complex &c1);
int isgreater(Complex x,Complex y);
class Complex
{
friend Complex Add(const int a,const Complex &c1);
friend Complex Jian(const int a,const Complex &c1);
friend Complex Chen(const int a,const Complex &c1);
friend Complex Chu(const int a,const Complex &c1);
public:
Complex(double r=0, double i=0) :real(r), imag(i){}
~Complex(){}
Complex operator+(const Complex& c1)const;
Complex operator-(const Complex& c1)const;
Complex operator*(const Complex& c1)const;
Complex operator/(const Complex& c1)const;
Complex operator-();
Complex operator++();
Complex operator++(int);
bool operator==(const Complex& c1)const;
bool operator!=(const Complex& c1)const;
bool operator>(const Complex& c1)const;
bool operator<(const Complex& c1)const;
friend ostream operator<<(ostream& out, const Complex& c);
friend istream& operator>>(istream& in,Complex& c);
friend int isgreater(Complex x,Complex y);
private:
double real;
double imag;
};
Complex Complex::operator+(const Complex& c1)const
{
Complex temp;
temp.real = real + c1.real;
temp.imag = imag + c1.imag;
return temp;
}
Complex Complex::operator-(const Complex& c1)const
{
Complex temp;
temp.real = real - c1.real;
temp.imag = imag - c1.imag;
return temp;
}
Complex Complex:: operator*(const Complex& c1)const{
Complex temp;
temp.real = real * c1.real;
temp.imag = imag * c1.imag;
return temp;
}
Complex Complex:: operator/(const Complex& c1)const
{
Complex temp;
temp.real = real / c1.real;
temp.imag = imag / c1.imag;
return temp;
}
Complex Add(const int a,const Complex &c1)
{
Complex temp;
temp.real = a + c1.real;
temp.imag = c1.imag;
return temp;
}
Complex Jian(const int a,const Complex &c1)
{
Complex temp;
temp.real = c1.real - a;
temp.imag = c1.imag;
return temp;
}
Complex Chen(const int a,const Complex &c1)
{
Complex temp;
temp.real = c1.real * a;
temp.imag = c1.imag;
return temp;
}
Complex Chu(const int a,const Complex &c1)
{
Complex temp;
temp.real = c1.real / a;
temp.imag = c1.imag;
return temp;
}
Complex Complex::operator-()
{
return Complex(-real, -imag);
}
Complex Complex::operator++()
{
++real;
++imag;
return Complex(real, imag);
}
Complex Complex::operator++(int)
{
Complex temp(*this);
real++;
imag++;
return temp;
}
bool Complex::operator==(const Complex& c1)const
{
return real == c1.real&&imag == c1.imag;
}
bool Complex::operator!=(const Complex& c1)const
{
return real != c1.real && imag != c1.imag;
}
bool Complex::operator>(const Complex& c1)const
{
return real > c1.real && imag > c1.imag;
}
bool Complex:: operator<(const Complex& c1)const
{
return real < c1.real && imag
}
ostream operator<<(ostream& out, const Complex& c)
{
out <
return out;
}
istream& operator>>(istream& in,Complex& c)
{
in>>c.real>>c.imag;
return in;
}
int isgreater(Complex x,Complex y)
{
return sqrt(x.real*x.real+x.imag*x.imag)>sqrt(y.real*y.real+y.imag*y.imag);
}
void main()
{
int n;
cout<<"請輸入復(fù)數(shù)個數(shù)";
cin>>n;
vector a(n);
vector::iterator itr;
for(itr = a.begin();itr
cin>>*itr;
sort(a.begin(),a.end(),isgreater);
for(itr = a.begin();itr
{
cout<<*itr<
}
}