三.总结重载运算符和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);

{


    void show(){cout<<real<<"\t"<<imag<<endl;};
};
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之间的元素;







猜你喜欢

转载自blog.csdn.net/lanshan1111/article/details/80427856
今日推荐