运算符重载和STL学习总结

一、运算符重载

1、重载运算符的限制:

重载运算符函数可以对运算符作出新的解释,但原有基本语义不变:

不改变运算符的优先级
不改变运算符的结合性
不改变运算符所需要的操作数
不能创建新的运算符

2、重载运算符的具体格式

class X {

    //…

返回类型 operator运算符(形参表);

  //…

}

在类外定义成员运算符函数的格式如下:

返回类型 X::operator运算符(形参表)

{

     函数体

}

3、用成员或友元函数重载运算符 

①、一元运算符:

Object op    或    op Object

重载为成员函数,解释为:

Object . operator op ()

操作数由对象Object通过this指针隐含传递

重载为友元函数,解释为:

operator op (Object)

操作数由参数表的参数Object提供

②、二元运算符:

ObjectL op ObjectR

重载为成员函数,解释为:

ObjectL . operator op ( ObjectR )

左操作数由ObjectL通过this指针传递,右操作数由参数ObjectR传递

重载为友元函数,解释为:

operator op ( ObjectL, ObjectR )

左右操作数都由参数传递

4、【】()运算符使用

【】运算符用于访问数据对象的元素

重载格式  类型  ::operator[]  ( 类型

()运算符用于函数调用

重载格式  类型  类:: operator()  ( 参数表  

*注:(1)运算符【】和()是二元运算符,只能用成员函数重载,不能用友元函数重载。

         (2)重载输出(输入)运算符只能用友元函数重载。

5、重载输出输入流
cin是 istream的对象,coutostream的对象
运算符 <<ostream重载为插入操作,用于输出基本类型数据
运算符 >>istream重载为提取操作,用于输入基本类型数据
用友元函数重载<<>>,输出和输入用户自定义的数据类型
例:定义“>>”重载函数
istream& operator>>(istream& in,class_name& obj)  
    {  
            in>>obj.item1;  
            in>>obj.item2;  
            . . .  
            in>>obj.itemn;  
            return in;  
    }   

二、STL模板库

STL是C++标准程序库的核心,深刻影响了标准程序库的整体结构。

STL由一些可适应不同需求的集合类(collection class),以及在这些数据集合上操作的算法(algorithm)构成

STL内的所有组件都由模板(template)构成,其元素可以是任意类型。

STL是所有C++编译器和所有操作系统平台都支持的一种库。

1、STL组件
容器(Container) - 管理某类对象的集合
迭代器(Iterator) - 在对象集合上进行遍历
算法(Algorithm) - 处理集合内的元素
容器适配器(container adaptor)
函数对象(functor)

2、STL容器类别
序列式容器-排列次序取决于插入时机和位置
关联式容器-排列顺序取决于特定准则

3、STL容器的共同能力
所有容器中存放的都是值而非引用。如果希望存放的不是副本,容器元素只能是指针。
所有元素都形成一个次序(order),可以按相同的次序一次或多次遍历每个元素

4、STL容器元素的条件
必须能够通过拷贝构造函数进行复制
必须可以通过赋值运算符完成赋值操作
必须可以通过析构函数完称销毁动作
序列式容器元素的默认构造函数必须可用
某些动作必须定义operator ==,例如搜寻操作
关联式容器必须定义出排序准则,默认情况是重载operator <
*注: 对于基本数据类型(int,long,char,double,…)而言,以上条件总是满足

5、STL容器的共同操作

初始化

          产生一个空容器

         ①以另一个容器元素为初值完成初始化

         以数组元素为初值完成初始化。

与大小相关的操作

         size( )返回当前容器的元素数量

         empty( )—判断容器是否为空

         max_size( )—返回容器能容纳的最大元素数量。

比较

         比较操作两端的容器必须属于同一类型

         如果两个容器内的所有元素按序相等,那么这两个容器相等

         采用字典式顺序判断某个容器是否小于另一个容器

赋值和交换

          swap用于提高赋值操作的效率

          与迭代器相关的操作

          begin()—返回一个迭代器,指向第一个元

          end()—返回一个迭代器,指向最后一个元素之后

          rbegin()—返回一个逆向迭代器,指向逆向遍历的第一个元素

          rend()—返回一个逆向迭代器,指向逆向遍历的最后一个元素之后

  元素操作

          insert(pos,e)—将元素e的拷贝安插于迭代器pos所指的位置

          erase(beg,end)—移除【beg,end】区间内的所有元素

          clear()—移除所有元素


5、迭代器

可遍历STL容器内全部或部分元素的对象

指出容器中的一个特定位置


6、容器

(1)vector

vector模拟动态数组
vector的元素可以是任意类型T,但必须具备赋值和拷贝能力(具有public拷贝构造函数和重载的赋值操作符)
必须包含的头文件#include
vector支持随机存取
vector的大小(size)和容量(capacity
size返回实际元素个数
capacity返回vector能容纳的元素最大数量。如果插入元素时,元素个数超过capacity,需要重新配置内部存储器

例:
vec.begin()//指向迭代器中第一个元素。     
vec.end()//指向迭代器中末端元素的下一个,指向一个不存在元素。            
vec.push_back(elem)     //在尾部加入一个数据。    
vec.pop_back()          //删除最后一个数据。    
vec.capacity()  //vector可用空间的大小。    
vec.size()//返回容器中数据个数。    
vec.empty() //判断容器是否为空。    
vec.front()     //传回第一个数据。    
vec.back()  //传回最后一个数据,不检查这个数据是否存在。    
vec.at(index)   //传回索引idx所指的数据,如果idx越界,抛出out_of_range。    
vec.clear() //移除容器中所有数据。    
vec.erase(iterator) //删除pos位置的数据,传回下一个数据的位置。    
vec.erase(begin,end)    //删除[beg,end)区间的数据,传回下一个数据的位置。注意:begin和end为iterator    
vec.insert(position,elem)   //在pos位置插入一个elem拷贝,传回新数据位置。    
vec.insert(position,n,elem) //在pos位置插入n个elem数据,无返回值。    
vec.insert(position,begin,end)  //在pos位置插入在[beg,end)区间的数据,无返回值。  

(2)map

使用平衡二叉树管理元素
元素包含两部分(key,value)keyvalue可以是任意类型
必须包含的头文件#include
根据元素的key自动对元素排序,因此根据元素的key进行定位很快,但根据元素的value定位很慢
不能直接改变元素的key,可以通过operator[]直接存取元素值
map中不允许key相同的元素,multimap允许key相同的元素

(3)set
使用平衡二叉树管理元素
集合(Set)是一种包含已排序对象的关联容器。
必须包含的头文件#include
map容器是键-值对的集合,好比以人名为键的地址和电话号码。相反地,set容器只是单纯的键的集合。当我们想知道某位用户是否存在时,使用set容器是最合适的。
set中不允许key相同的元素,multiset允许key相同的元素

总结:

学习了运算符重载和STL之后,使我的代码更加简洁,同时也可以更方便地解决问题。但C++的难度越来越大,也越来越难掌握,课下还需多多练习。





你可能感兴趣的:(运算符重载和STL学习总结)