三.总结重载运算符和STL
一.重载运算符中最常见的就是输入输出及小于大于号运算符了,在一些时候重载运算符很方便很好使用
以一个程序为例:
#include<bits/stdc++.h>
using namespace std;
class complexs
{
private:
int real;
int imag;
public:
complexs()
{
real=0;
imag=0;
}
complexs(int a,int b):real(a),imag(b){}
complexs operator+(complexs &c);//complexs为返回类型,重载加号运算符;
friend istream&operator>>(istream&,complexs&c);//重载输入运算符
friend ostream&operator<<(ostream&,complexs&c);//重载输出运算符
friend bool operator<(complexs &c1,complexs &c2);//重载小于号运算符1
bool operator<(complex &c)//重载小于号运算符2;两种方法都行
{
return (real<c.real&&imag<c.imag);
{
};
bool operator<(complexs &c1,complexs &c2)
{
return c1.real<c1.imag;
}
istream&operator>>(istream&input,complexs &c)
{
cout<<"please input real and imag \t";
input>>c.real>>c.imag;
return input;
}
ostream&operator<<(ostream&output,complexs &c)
{
if(c.imag>0) output<<"("<<c.real<<"+"<<c.imag<<"i)";//而且,在重载过程中可以添加附加条件,便于程序调试;
else output<<"("<<c.real<<c.imag<<"i)";
return output;
}
complexs complexs::operator+(complexs &c)
{
return complexs(real+c.real,imag+c.imag);
}
int main()
{
complexs c1(2,3),c2(2,3),c3;
c3=c1+c2;
c3.show();
complexs c4,c5,c6;
cin>>c4>>c5;
c6=c4+c5;
cout<<c6<<endl;
if(c4<c5)cout<<"YES";
else cout<<"NO";
return 0;
}
//不能用友元函数重载的运算符有:= () []
//重载=号和深复制复习
//不能用友元函数重载的运算符有:= () []#include<bits/stdc++.h>
using namespace std;
class name
{
public:
name(char *p);
name(const name& );
name &operator=(name&n);
~name();
private:
char *ppp;
int size;
};
name::name(char *p)
{
cout<<"construct"<<p<<endl;
size=strlen(p);
ppp=new char[size+1];
if(ppp!=0)strcpy(ppp,p);
}
name::name(const name&ob)
{
cout<<"copying"<<ob.ppp<<"into\n";
size=ob.size;
ppp=new char[size+1];
if(ppp!=0)strcpy(ppp,ob.ppp);
}
name&name::operator=(name&n)
{
delete[]ppp;
size=n.size;
ppp=new char[size+1];
if(ppp!=0)strcpy(ppp,n.ppp);
return *this;//return 的是此对象 return *this;
}
name::~name()
{
cout<<"destruct"<<ppp<<endl;
ppp[0]='\0';
delete[]ppp;
ppp=NULL;
size=0;
}
int main()
{
name obj("lalaa");
name obj2=obj;
name obj3("hahah");
obj3=obj2=obj;
}
二.STL
STL真的是非常好用,有些情况下可以很容易地实现某些功能;
STL主要包括容器,目前最常用的就是vector;还有迭代器,相当于容器的一个副本,对元素进行遍历;还有算法,也就是对元素进行各种操作,有特殊的语句来执行;
一.容器的共同操作:
1.产生一个空容器
vector<int/double 等类型>v;v是名字;
2.初始化
以一个容器初始化vector<类型>v1(v.begin(),v.end());
以数组元素初始化
int a[]={0,1,2,3,4};
vector<类型>v2(a,a+sizeof(a));
3.与大小相关操作
a.size()返回a内元素个数
a.empty()判断是否为空
a.max_size();返回a内最大可容纳元素个数
比较操作两端的容器必须属于同一类型//同一类型
如果两个容器内的所有元素按序相等,那么这两个容器相等
采用字典式顺序判断某个容器是否小于另一个容器
例如:
vector<int>v;
for(int i=0;i<=5;i++)
v.push_back(i);
cout<<v.size()<<endl;;
if(v.empty())cout<<"empty"<<endl;
else cout<<"not empty"<<endl;
vector<int>v1(v.begin(),v.end());
vector<int>::iterator it;
for(it=v1.begin();it!=v1.end();it++)
cout<<*it<<endl;
4.元素操作
insert(pos,e)-将元素e的拷贝安插于迭代器pos所指的位置
erase(beg,end)-移除[beg,end]区间内的所有元素
clear()-移除所有元素
5.迭代器
vector<int>::iterator it;
a.begin()是第一个元素;
a.end()是指向最后一个元素之后
这样做的好处就是为循环结束提供依据
二。重点介绍vector
1.vector<t>c1(c2);产生了同类型的c1,复制了c2中元素
vector<t>c(n);大小为n;
vector<t>c(n,e);大小为n,每个元素都是e;
~vector<t>()销毁所有元素并且释放内存
2.赋值
c1=c2;
c.assign(n,e);将元素e的n个赋值拷贝给c
c.swap(c1);c1,c元素互换
swap(c,c1);同上
3.重要操作
vector<int>::iterator it;
a.begin()是第一个元素;
a.end()是指向最后一个元素之后
c.erase(pos)删除pos位置的元素,返回下一个元素位置
c.erase(beg,end)删除区间内所有元素并且返回下一个元素位置
c.clear()清空元素
4.
multimap<key,value>m;key为关键字;根据key位置自动对元素排序;
1.操作:
vector<int>::iterator it;
a.begin()是第一个元素;
a.end()是指向最后一个元素之后
c.erase(pos)删除pos位置的元素,返回下一个元素位置
c.erase(beg,end)删除区间内所有元素并且返回下一个元素位置
c.clear()清空元素
m.count(key)返回键值等于key的个数
m.find(key)返回键值等于key的第一个元素,找不到返回end
m.lower_bound(key)返回键值大于等于key的第一个元素
m.upper_bound(key)返回键值大于key的第一个元素
m.equal_range(key)返回键值等于key的元素区间
m.erase(pos)删除迭代器pos所指向的位置的元素
c.erase(val)删除所有值为val的所有元素
例如:upper 与 lower使用
找寻T1,T2之间的元素;