运算符重载与STL学习总结

运算符重载与STL学习心得

运算符重载

不能重载的运算符:

. :: .* ?: sizeof

 

运算符重载函数可以重载为成员函数和友元函数两种。

Ⅰ:函数重载运算符:

类型 operator运算符(参数表);

返回类型 类名::operator +(参数表){}

 

Ⅱ:友元重载运算符:

friend类名 operator +(参数表);

类名operator +(参数表){}

 

成员运算符函数与友元运算符函数的比较:

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

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

注意:

一:重载赋值运算符=用于对象数据的复制  只能用成员函数重载

类名 & 类名 ::operator = (类名);

 

二:重载运算符[]、()、=、->仅能用成员函数重载

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

()运算符用于函数调用

样例:重载()

#include 
using namespace std;
class PingF
{
    public:
    int operator()(int x,int y);
};
int PingF::operator()(int x,int y)
{
    return (x+y)*(x+y);
}
int main()
{
    PingF ff;
    int a,b;
    cin>>a>>b;
    cout<

三:重载流插入和流提取运算符仅能用友元函数重载

样例:重载>>和<<运算符

#include 
using namespace std;
class Point
{
    private:
    int x;
    int y;
    public:
    Point(){x=0;y=0;}
    Point (int x1,int y1)
    {
        x=x1;
        y=y1;
    }
    friend ostream &operator <<(ostream & out,Point &p);
    friend istream &operator >>(istream & in,Point &p);
};
istream &operator >>(istream &in,Point &p)
{
    cout<<"Please input a point:"<>p.x;
    in>>p.y;
    return in;
}
ostream &operator <<(ostream &out,Point &p)
{
    out<<"("<>jj;
    cout<

心得体会:

重载运算符可以节省很多代码量,让运算符按照自定义方式运算,类似于自定义函数。

 

C++标准模板库(STL)

STL组件:容器、迭代器、算法

常用容器:
list set map 提供双向迭代器

vector deque string 提供随机存取迭代器

vector容器的操作

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

empty() 判断容器是否为空

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

一:比较(c1运算符c2)

运算符:==、!=、<、<=、>、>=

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

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

二:赋值

c1=c2 将c2的全部元素赋值给c1

c1.swap(c2) 将c1和c2的元素互换

swap(c1,c2) 全局函数,将c1和c2的元素互换

三:添加元素

c.insert(pos,e) 在pos位置插入元素e的副本,并返回新元素位置

c.insert(pose,n,e) 在pos位置插入n个元素e的副本

c.insert(pos,beg,end) 在pos位置插入区间[beg,end]内所有元素的副本

c.push_back(e) 在尾部添加一个元素e的副本

四:移除元素

c.pop_back() 移除最后一个元素但不返回最后一个元素

c.erase(pos) 删除pos位置的元素,返回下一个元素的位置

c.erase(beg,end) 删除区间[beg,end]内所有元素,返回下一个元素的位置

c.clear() 移除所有元素,清空容器

c.resize() 将元素数量改为num(增加的元素用defalut构造函数产生,多余的元素被删除)

c.resize(num,e) 将元素数量改为num(增加的元素是e的副本)

map/multimap 容器的操作

一:特殊寻找操作

count (key) 返回键值等于key的元素个数

find(key) 返回键值等于key的第一个元素,找不到返回end

lower_bound(key) 返回键值大于等于key的第一个元素

upper_bound(key) 返回键值大于key的第一个元素

equal_range(key) 返回键值等于key的元素区间

二:添加元素

c.insert(pos,e) 在pos位置为起点插入e的副本,并返回新元素的位置(插入速度取决于pos)

c.insert(e) 插入e的副本,并返回新元素位置

c.insert(beg,end) 将区间[beg,end]内所有元素的副本插入到c中

三:移除元素

c.erase(pos) 删除迭代器pos所指位置的元素,无返回值

c.erase(val) 移除所有值为val的元素,返回移除元素个数

c.erase(beg,end) 删除区间[beg,end]内所有元素,无返回值

c.clear() 移除所有元素,清空容器

 

map容器是 键-值对儿的集合而set容器仅是单纯的键的集合

当想要知道某个元素是否存在时,使用set容器是最合适的,且不允许key相同的元素存在

迭代器(iterator)

所有容器都提供两种迭代器

container::iterator 以读/写模式遍历元素

container::const_iterator 以只读模式遍历元素

 

与迭代器相关的操作

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

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

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

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

算法(Algorithm)

常用算法

count() 计数

count_if() 计算符合条件的个数

min_element() 返回区间中最小元素的迭代器,以“<”作比较器

max_element() 返回区间中最大元素的迭代器,以“<”作比较器

for_each() 对区间中的每个元素e,执行f(e),要求f(e)不能改变e

find() 返回区间中的迭代器i

find_if() 返回区间中满足条件的迭代器i

binary_search() 折半查找,要求容器已经有序且支持随机访问迭代器

lower_bound() 要求区间有序,查找大于等于元素的最小的位置

upper_bound() 要求区间有序,查找大于元素的最小位置

equal_range() 要求区间有序,返回值是pair

sort() 快速排序,按升序排序

unique() 改变序列,去除升序区间中的重复元素,返回值是迭代器

指向元素删除后的区间的最后一个元素的后面

reverse() 颠倒区间中的顺序


vector使用样例:

#include 
#include 
#include 
using namespace std;
int main()
{
    vector a;
for (int i = 0; i < 5; ++i)
{
        a.push_back(5 - i);
    }
    cout << "Size: " << a.size() << endl;
    a.pop_back();
    a[0] = 1;
    cout << "Size: " << a.size() << endl;
for (int i = 0; i < (int)a.size(); ++i)
{
        cout << a[i] << ", " << endl;
    }
    cout << endl;
    sort(a.begin(), a.end());
    cout << "Size: " << a.size() << endl;
for (int i = 0; i < (int)a.size(); ++i)
{
        cout << a[i] << ", " << endl;
    }
    cout << endl;
    a.clear();
    cout << "Size: " << a.size() << endl;
    return 0;
}

心得体会:

STL容器操作内容较多,但常用到的东西较少。

其中很多内容并没有深入理解,等用STL写出东西来再贴上代码。






你可能感兴趣的:(C++)