运算符重载和STL复习总结

不能重载的运算符包括   . ::  .*  ?:  sizeof

可重载的运算符包括  

-  * /  %  ^  &  |  ~

!  = <  >  +=  -=  *=  /=  %

^= &=  |=  <<  >>  >>= <<=  ==  !=

<= >=  &&  ||  ++  --  ->*  ‘ ->

[]  () new  delete  new[]  delete[]

  重载运算符函数是对运算符的功能进行增加,并且原有的语义不变。1不改变运算符的优先级,。2不改变运算符的结合性。3不改变运算符所需要的操作数。4不能创建新的运算符。

  运算符函数可以重载为成员函数或友元函数。

一元运算符:Object op       op  Objectop为运算符)

重载为成员函数,解释为:Object .operator op ()  操作数由对象Object通过this指针隐含传递,因此参数表没有参数。函数调用方式有两种(1)op对象;(2)对象.operator op()。这两种调用方式是等价的。

扫描二维码关注公众号,回复: 1671492 查看本文章

在类外的定义:返回类型 类名::operator op (形参表){}

重载为友元函数,解释为:operatorop(Object)  操作数由参数表的参数Object提供。

在类外的定义:返回类型 operator op(形参表){}

二元运算符ObjectL  op ObjectR 两个对象来操作

重载为成员函数,解释为:ObjectL .operatorop ( ObjectR )  左操作数由ObjectL通过this指针传递,右操作数由参数ObjectR传递。函数有两种调用方式(1)对象1op对象2;(2)对象1.operator op(对象2)这两种调用方式也是等价的。

重载为友元函数,解释为:operatorop (ObjectL, ObjectR )  左右操作数都由参数传递。

二元运算符在操作数类型不同时,必须使用友元类重载。

  友元函数重载运算符常用于运算符的左右操作数类型不同的情况,在第一个参数需要隐式转换的情形下,使用友元函数重载运算符是正确的选择。友元函数没有 this指针,所需操作数都必须在参数表显式声明,很容易实现类型的隐式转换。C++中不能用友元函数重载的运算符有   =   ()    []   >

  对于几个常用的运算符++  --  =  []  ()  <<  >>

++--有前后两种方式,后置或者前置中需要加上int虚参进行区分。

=必须重载为成员函数。

运算符[]()是二元运算符。[]()=一样,只能用成员函数重载,不能用友元函数重载。

<<>>只能重载为友元函数,下面是类中和类外输入输出运算符的定义。

friend ostream& operator<<(ostream & os,const Date & p2);
friend istream & operator>>(istream & is,Date & p2);

ostream &operator<<(ostream & os,const Date & p2)
{
    os<<p2.month<<""<<p2.day<<" "<<p2.hour<<""<<p2.minute;
    return os;
}
istream & operator>>(istream & is,Date & p2)
{
    is>>p2.month;
    is>>p2.day;
    is>>p2.hour;
    is>>p2.minute;
    return is;
}

  STLC++标准程序库的核心,深刻影响了标准程序库的整体结构,由一些可适应不同需求的集合类(collection class,以及在这些数据集合上操作的算法(algorithm构成,内的所有组件都由模板(template构成,其元素可以是任意类型,是所有C++编译器和所有操作系统平台都支持的一种库。STL可以用容器(Container)迭代器(Iterator)算法(Algorithm 三部分概括。

  容器的作用是管理某类对象的集合,容器又分为两类1是序列式容器(序列式容器元素的默认构造函数必须可用)2是关联式容器(关联式容器必须定义出排序准则,默认情况是重载operator <)。定义一个空的容器  std::list<int>l; 如果两个容器进行比较的话两个容器的类型必须相同。

  迭代器的作用是在对象集合上进行遍历,指出容器中的一个特定位置,要注意的是end()操作是指向最后一个元素之后,而不是最后一个元素。所有容器都提供两种迭代器container::iterator/模式遍历元素;container::const_iterator只读模式遍历元素。迭代器分为双向迭代器随机存取迭代器。

   算法的作用是处理集合内的元素。

向量vector

  vector的作用和数组类似,但是是动态数组,比数组更加方便,好用。vector的元素可以是任意类型T,但必须具备赋值和拷贝能力。使用vector必须使用头文件#include<vector>vector的用法包括创建一个空的向量vector<T>cc.size()返回元素个数,c.push_back(e)在尾部添加一个元素e的副本。c.pop_back()移除最后一个元素但不返回最后一个元素。等等。

map/multimap:

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

产生一个空的mapmap map1; map<string,int>map1;用数组方式对map进行赋值: map1[“a”]=1; map1[“b”]=2;其中map可以是下列形式map<key,value> 一个以less<)为排序准则的mapmap<key,value,op> 一个以op为排序准则的mapmap的函数用法和vector差不多。但是mapcount(key) 返回键值等于key”的元素个数,find(key)返回键值等于key”的第一个元素,找不到返回end函数。这也使得map可以更加方便的在数据中找到需要查询的数据。map还有lower_bound(key)返回键值大于等于key”的第一个元素,upper_bound(key) 返回键值大于key”的第一个元素,equal_range(key) 返回键值等于key”的元素区间。

set/multiset

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

算法:

  所有算法的前两个参数都是一对iterators:[firstlast),用来指出容器内一个范围内的元素。大部分算法都可以用functioin object 来更改准则。算法中的几个典型的函数1count:计算[first,last) 中等于val的元素个数。2count_if 计算[first,last) 中符合pr(e) == true 的元e的个数。3 min_element:  返回[first,last) 中最小元素的迭代器, < ”作比较器。max_element:返回[first,last) 中最大(不小)元素的迭代器, < ”作比较器。4  for_each[first,last)中的每个元素e,执行f(e),要求 f(e)不能改变e5  find返回区间 [first,last)中的迭代器 i ,使得 * i == val6  find_if返回区间 [first,last)中的迭代器 i,使得pr(*i)==true.7 binary_search 折半查找,要求容器已经有序且支持随机访问迭代器,返回是否找到.8lower_bound要求[first,last)是有序的,查找大于等于val的最小的位置. upper_bound要求[first,last)是有序的,查找大于val的最小位置.9 sort  快速排序.10 unique去除[first,last) 这个升序序列中重复元素返回值是迭代器,指向元素删除后的区间的最后一个元素的后面。 11reverse颠倒区间[first,last)顺序。
  在进行了运算符重载和STL学习之后,对于代码的编写又多了许多新的方法,但是对于方法的增多,掌握的不是特别的好。对于运算符重载,就是对运算符进行功能的增加,使得代码可以更加简洁和更加容易阅读。学习了STL对于一些操作确实变简单了许多,但是对于STL,到现在我也是只是会用一点皮毛,对于大部分内容来说还不是太熟练,还需要多多的进行写代码的练习。

猜你喜欢

转载自blog.csdn.net/sdau20171794/article/details/80424425