运算符重载
不能重载的运算符:
. :: .* ?: 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<
心得体会:
重载运算符可以节省很多代码量,让运算符按照自定义方式运算,类似于自定义函数。
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写出东西来再贴上代码。