stl模板库和运算符重载

最近几周我们学习了stl和运算符重载,从中受益很多,但还有很

多不懂的地方,不过我确实是学会了很多,从这几周的学习中下

是我的一些学习总结:

一 运算符重载

1.重载的限制

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

不变:

  (1)不改变运算符的优先级

  (2)不改变运算符的结合性

  (3)不改变运算符所需要的操作数

  (4)不能创建新的运算符

2,用成员或友元函数重载运算符 :

(1)一元运算符:

Object op    或    op Object

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

Object . operator op ()

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

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

operator op (Object)

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


(2)二元运算符:


ObjectL op ObjectR

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

ObjectL . operator op ( ObjectR )

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

传递

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

operator op ( ObjectL, ObjectR )


左右操作数都由参数传递

例子:有一个Time类,包含数据成员minute(分)和sec(秒),模

拟秒表,每次走一秒,满60秒进一分钟,此时秒又从0开始算。

要求输出分和秒的值。

class Time

{

public:

  Time(){minute=0;sec=0;}

  Time(intm,ints):minute(m),sec(s){ }

  Time operator++( );     //声明前置自增运算符“++”重载函数

  Time operator++(int);   //声明后置自增运算符“++”重载函数

private:

  intminute;

  intsec;

};

Time Time∷operator++( )    //定义前置自增运算符“++”重载函数

{

  if(++sec>=60)  { 

  sec-=60;         //60秒进1分钟

  ++minute;

  }

  return*this;          //返回当前对象值

}

Time Time∷operator++(int)  //定义后置自增运算符“++”重载函数

{

  Timetemp(*this);

  sec++;

  if(sec>=60)  {

  sec-=60;

  ++minute;

  }

  returntemp;         //返回的是自加前的对象

}

注意:


1:成员运算符函数比友元运算符函数少带一个参数(后置的

++、--需要增加一个形参)。


2: 双目运算符一般可以被重载为友元运算符函数或成员运算符

函数,但当操作数类型不相同时,必须使用友元函数。

3:几种特殊情况:

(1)运算符【】和()是二元运算符,只能用成员函数重载,

不能用友元函数重载。


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

4:重载运算符[ ]和()

(1)重载下标运算符 []

[] 运算符用于访问数据对象的元素

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



       设 x 是类 X 的一个对象,则表达式


              x[ y ]


       可被解释为


              x. operator [ ] ( y )


(2)重载函数调用符 ()


() 运算符用于函数调用


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





       设 x 是类 X 的一个对象,则表达式


              x( arg1, arg2, … )


       可被解释为


              x. operator () (arg1, arg2, … )

注意:

运算符[]和()是二元运算符

[]和()只能用成员函数重载,不能用友元函数重载 

5.重载输出输入流

cin是 itream的对象,cout是ostream的对象

运算符 <<由ostream重载为插入操作,用于输出基本类型数据

运算符 >>由istream重载为提取操作,用于输入基本类型数据

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

例如:

istream&operator>>(istream&in,class_name&obj)

    {

            in>>obj.item1;

            in>>obj.item2;

            . . .

            in>>obj.itemn;

            return in;

    }

注意:

只能被重载成友元函数,不能重载成成员函数

赋值运算符重载用于对象数据的复制

operator=必须重载为成员函数

二 stl模板库

1:STL简介

(1)STL是C++标准程序库的核心,深刻影响了标准程序库的

整体结构。

(2)STL由一些可适应不同需求的集合类(collection 

class),以及在这些数据集合上操作的算法(algorithm)构成

(3)STL内的所有组件都由模板(template)构成,其元素可

以是任意类型。

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

库。

2:stl组件

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

stl模板库和运算符重载_第1张图片

3:STL容器类别

       (1)序列式容器——排列次序取决于时机和位置

       (2)关联式容器——排列顺序取决于特定准则

4:迭代器

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

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

5:容器

(1)vector

vector     为了使用vector,必须包含头文件

vector模拟动态数组

vector的元素可以是任意类型T,但必须具备赋值和拷贝能力

(具有public拷贝构造函数和重载的赋值操作符)

必须包含的头文件#include

vector支持随机存取

vector的大小(size)和容量(capacity)

sie返回实际元素个数,

capacity返回vector能容纳的元素最大数量。如果插入元素时,

元素个数超过capacity,需要重新配置内部存储器

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

(2)map/multimap

使用平衡二叉树管理元素

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

必须包含的头文件#include

根据元素的key自动对元素排序,因此根据元素的key进行定位

很快,但根据元素的value定位很慢

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

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

(3)set/multiset

使用平衡二叉树管理元素

集合(Set)是一种包含已排序对象的关联容器。

必须包含的头文件#include

map容器是键-值对的集合,好比以人名为键的地址和电话号

码。相反地,set容器只是单纯的键的集合。当我们想知道某位

用户是否存在时,使用set容器是最合适的。

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

三 学习心得总结

这两个知识点使代码变得更加简洁明了,在解决ATM的问题上

有很大作用,让我少了很多麻烦。例如:对"<”进行重载实现

了时间类的直接比较,用vector,map, multimap来存储记

录,实现查找等功能。我感觉我还需继续努力,学好这部分知

识!


你可能感兴趣的:(stl模板库和运算符重载)