运算符重载和STL

重载运算符

运算符重载指赋予运算符新的操作功能,主要用于对类的对象的操作

运算符重载定义形式:  运算符重载:重新定义运算符的功能

<类型><类名>::operator<操作符><参数表>

{  函数体 }

⭐可以重载的运算符:绝大部分,如算术运算符,关系运算符,关系运算符,逻辑运算符,位运算符,下标运算符【】,插入运算符>>,提取运算符<<

不能重载的运算符:::”“.”“.*”“?:

例:两个虚数的运算符重载

首先定义虚数类

叙述可以表示为  a+bi

#include<iostream>

Using namespace std;

Class Complex

{   double real,image;

Public:

  Complex(double r=0,double i=0):real(r),image(i){}

  double Real(){return real}

  double image(){return image;}

Complex operator +(complex &);

Complex operator +(double);

Bool operator ==(complex);

~Complex(){};

};

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

区别:成员函数具有this指针,友元函数没有this指针。

一元运算符 object opop object

重载为成员函数时,编译器解释为 object.operator op()

重载为友元函数是,编译器解释为operator op(object)

二元运算符  要求有左右操作数 ObjectL op ObjectR

  重载为成员函数时,编译器解释为 ObjectL.operator op(objectR) 左操作数由ObjectL通过this 指针传递,右操作数由ObjectR传递

  重载为友元函数时,编译器解释为 operator opObjectLObjectR)

成员运算符函数和友元运算符函数的区别:

1 成员运算符函数比友元运算符函数少带一个函数(后置的++--需要一个形参)

2 双目运算符一般可以被重载为友元运算符函数或友元运算符函数,但当操作数类型不相同时,必须使用友元函数。

几个典型运算符重载

递增运算符( ++ )和递减运算符( -- )是 C++ 语言中两个重要的一元运算符。

实例

Time(int h, int m)
{ hours = h; minutes = m; } // 显示时间的方法 
void displayTime()
{ cout << "H: " << hours << " M:" << minutes <<endl; } // 重载前缀递增运算符( ++ ) 
Time operator++ () 
{ ++minutes; // 对象加 1 
if(minutes >= 60) 
{ ++hours; minutes -= 60; } 
return Time(hours, minutes); } // 重载后缀递增运算符( ++ ) Time operator++( int ) 
{ // 保存原始值 Time T(hours, minutes); // 对象加 1 ++minutes;
 if(minutes >= 60) 
{ ++hours; minutes -= 60; } // 返回旧的原始值 return T; } };
 int main() 
{ Time T1(11, 59), T2(10,40); ++T1; // T1 加 1 
T1.displayTime(); // 显示 T1 ++T1; // T1 再加 1 T1.displayTime(); // 显示 T1 T2++; // T2 加 1 
T2.displayTime(); // 显示 T2 T2++; // T2 再加 1 
T2.displayTime(); // 显示 T2
 return 0; }

函数调用运算符 () 可以被重载用于类的对象。当重载()时,不是创造了一种新的调用函数的方式,相反地,这是创建一个可以传递任意数目参数的运算符函数。下面的实例演示了如何重载函数调用运算符 ()。

#include <iostream> 
using namespace std; 
class Distance 
{ private: int feet; // 0 到无穷 
int inches; // 0 到 12 public: // 所需的构造函数 Distance(){ feet = 0; inches = 0; }
 Distance(int f, int i){ feet = f; inches = i; } // 重载函数调用运算符 
Distance operator()(int a, int b, int c) 
{ Distance D; // 进行随机计算 D.feet = a + c + 10;
 D.inches = b + c + 100 ;
 return D;}

就像其他运算符一样,可以重载赋值运算符( = ),用于创建一个对象,比如拷贝构造函数。下面的实例演示了如何重载赋值运算符。

#include <iostream> using namespace std;  class Distance  { private: int feet; // 0 到无穷 int inches; // 0 到 12 public: // 所需的构造函数 Distance(){ feet = 0; inches = 0; }  Distance(int f, int i){ feet = f; inches = i; }  void operator=(const Distance &D )  { feet = D.feet; inches = D.inches; } // 显示距离的方法 void displayDistance() { cout << "F: " << feet << " I:" << inches << endl; } };  int main()  { Distance D1(11, 10), D2(5, 11);  cout << "First Distance : ";  D1.displayDistance();  cout << "Second Distance :"; D2.displayDistance(); // 使用赋值运算符 D1 = D2;  cout << "First Distance :"; D1.displayDistance();  return 0; }

STL

STL主要包含了容器,算法,迭代器。

容器

是容纳,包含相同类型元素的对象,主要用于类模板的实现。

序列型容器:容器中的元素按线性结构组织起来,可以逐个读写元素,主要代表有vector(向量),deque(双端队列).list(双向链表)

关联型容器:关联容器通过键存储和读取元素。主要有map(映射).set(集合)等。

容器适配器:是对前面提到的某些容器(如vector)进行再包装,使其变成另外一种容器。典型的有栈(stack),队列(queue

 

迭代器

是用于确定元素位置的数据类型,可以读取修改它指向的元素,它的用法和this

指针类似。

每一种容器都定义了一种迭代器

定义一种容器类的迭代器的方法可以是:

容器类名<元素类型>::iterator 变量名;

例如: vector<int>::iterator it;

访问一个迭代器指向的元素:

 *迭代器变量名

例如:*it=5

STL容器的共同操作

赋值和交换

swap用于提高赋值操作效率

与迭代器相关的操作

Begin()-返回一个迭代器,指向第一个元素

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

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

元素操作

Insertpos,e-将元素e的拷贝安插于迭代器pos所指的位置

Erasebeg.end-移除【beg,end】区间内的所有元素

Clear()-移除所有的元素

Vector

c.size()
返回元素个数
c.empty()
判断容器是否为空
c.max_ size()
返回元素最大可能数量(固定值)
c.capacity()
返回重新分配空间前可容纳的最大元素数量
c.reserve(n)扩大容量为n
c1==c2 判断c1是否等于c2
c1!=c2  判断c1是否不等于c2
c1<c2   判断c1是否小于c2
c1>c2   判断c1是否大于c2
c1<=c2  判断c1是否大于等于c2
c1>=c2  判断c1是否小于等于c2

c1 =c2  将c2的全部元素赋值给c1c.assign(n,e)  将元素e的n个拷贝赋值给c

c.assign(beg,end)  将区间[beg,end]的元素赋值给cc1.swap(c2)  将c1和c2元素互换swap(c1,c2)

vector<T> C  产生空的vector

vector<T> c1(c2)  产生同类型的c1,并将复制c2的所有元

vector<T> c(n)  利用类型T的默认构造函数和拷贝构造

函数生成一个大小为n的vector

vector<T> c(n,e)  产生一个大小为n的vector,每个元素

都是e

vector<T> c(beg,end)  产生-一个vector,以区间[beg,end]为

元素初值

~vector<T>(  销毁所有元素并释放内存

map/multimap

构造、拷贝和析构

使用平衡.二叉树管理元素

元素包含两部分(key,value), keyvalue可以是任意类型

必须包含的头文件#include <map>

根据元素的key自动对元素排序,因此根据元素的key进行定位很快,但根据元素的value定位很慢

不能直接改变元素的key,可以通过operator []直接存取元素值

map中不允许key相同的元素,multimap允许key相同的元素

mapc
产生空的map
map c1(c2)
产生同类型的c1,并复制c2的所有元素
map c(op)
op为排序准则产生一个空的map
map c(beg,end)
以区间[beg,end]内的元素产生一个map
map c(beg,end,op)
op为排序准则,以区间[beg,end]内的元
素产生一一个map
map()
销毁所有元素并释放内存。

count(key)

返回”键值等于key”的元素个数
find(key)
返回”键值等于key”的第一个元素,找不到
返回end
lower_ bound(key)
返回”键值大于等于key”的第一个元素
upper_ bound(key)
返回”键值大于key”的第一个元素
equal_ range(key)
返回”键值等于key”的元素区间

 set/multiset

 使用平衡二叉树管理元素

 集合(Set)是一种包含已排序对象的关联容器。必须包含的头文件#include <set>

 map容器是键-值对的集合,好比以人名为键的地址和电话号码。相反地,set容器只是单纯的键的集合。当我们想知道某位用户是否存在时,使用set容器是最合适的。

  set中不允许key相同的元素,multiset允许key相同的元素

  begin()  返回指向第一个元素的迭代器

  clear()  清除所有元素

  count()  返回某个值元素的个数

  empty()  如果集合为空,返回true

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

  equal range()  返回集合中与给定值相等的.上下限的两个迭代器

  erase()  删除集合中的元素

  find()  返回一个指向被查找到元素的迭代器

  get allocator()  返回集合的分配器

insert() 在集合中插入元素
lower bound()返回指向大于(或等于)某值的第一个元素的迭
代器
key comp()返回一个用于元素间值比较的函数
max size() 返回集合能容纳的元素的最大限值
rbegin()返回指向集合中最后一个元素的反向迭代器
rend()返回指向集合中第一个元素的反向迭代器
size()集合中元素的数目
upner bound()
返回大于某个值元素的迭代器

 



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值