运算符重载和STL

一, 运算符重载

1,重载运算符的限制:

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

  ·不改变运算符的优先级

  ·不改变运算符的结合性

  ·不改变运算符所需要的操作数

  ·不能创建新的运算符

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

class X {

    //…

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

  //…

}

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

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

{

    函数体

}

下面的实例中,同名函数 print() 被用于输出不同的数据类型:

#include<iostream>

using namespace std;

class printData

{

public:

    void print(int i)

    {cout<<"整数为:"<<i<<endl;}

    void print(double f)

    {cout<<"浮点数为:"<<f<<endl;}

    void print(string c)

    {cout<<"字符串为"<<c<<endl;}

};

int main(void)

{

printData pd;

//输出整数

pd.print(5);

//输出浮点数

pd.print(500.263);

//输出字符串

pd.print("Hello C++");

return 0;

}

当上面的代码被编译和执行时,它会产生下列结果:

整数为:5

浮点数为:500.263

字符串为:Hello C++

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、重载流插入和流提取运算符

(1)istream 和 ostream 是 C++ 的预定义流类
(2)cin 是 istream 的对象,cout 是 ostream 的对象
(3)运算符 << 由ostream 重载为插入操作,用于输出基本类型数据
(4)运算符 >> 由 istream 重载为提取操作,用于输入基本类型数据

(5)用友元函数重载 << 和 >> ,输出和输入用户自定义的数据类型 

例:

istream& operator>>(istream& in,class_name& obj)    
    {    
            in>>obj.item1;    
            in>>obj.item2;    
            . . .    
            in>>obj.itemn;    
            return in;    
    }  

ostream& operator<<(ostream& out,class_name& obj)  
    {  
          out<<obj.item1;  
          out<<obj.item2;  
          .. .  
          out<<obj.itemn;  
          return out;  
    }    

STL

一、简介

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

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

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

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

二、组件

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

三、容器类别

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

四、STL容器的共同能力

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

五、STL容器元素的条件

必须能够通过拷贝构造函数进行复制
必须可以通过赋值运算符完成赋值操作
必须可以通过析构函数完称销毁动作
序列式容器元素的默认构造函数必须可用
某些动作必须定义operator ==,例如搜寻操作
关联式容器必须定义出排序准则,默认情况是重载operator <



vector

vector模拟动态数组
vector的元素可以是任意类型T,但必须具备赋值和拷贝能力(具有public拷贝构造函数和重载的赋值操作符)
必须包含的头文件#include <vector>
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)区间的数据,无返回值。

map

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

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



学习心得:

重载运算符的存在实现了c++某些函数功能的合并,使得程序的编写和运行更加有效率,伴随着的是难度的提升,需要更多的课下时间来加以练习

猜你喜欢

转载自blog.csdn.net/aj171030/article/details/80473616
今日推荐