一.引用&
1.1函数参数
引用的一个重要作用就是作为函数的参数。以前的C语言中函数参数传递是值传递,如果有大块数据作为参数传递的时候,采用的方案往往是指针,因为 这样可以避免将整块数据全部压栈,可以提高程序的效率。但是现在(C++中)又增加了一种同样有效率的选择(在某些特殊情况下又是必须的选择),就是引用。
- 传递引用给函数与传递指针的效果是一样的。这时,被调函数的形参就成为原来主调函数中的实参变量或对象的一个别名来使用,所以在被调函数中对形参变量的操作就是对其相应的目标对象(在主调函数中)的操作。
- 不占空间。使用引用传递函数的参数,在内存中并没有产生实参的副本,它是直接对实参操作;而使用一般变量传递函数的参数,当发生函数调用时,需要给形参分配存储单元,形参变量是实参变量的副本;如果传递的是对象,还将调用拷贝构造函数。因此,当参数传递的数据较大时,用引用比用一般变量传递参数的效率和所占空间都好。
- 使用指针作为函数的参数虽然也能达到与使用引用的效果,但是,在被调函数中同样要给形参分配存储单元,且需要重复使用"*指针变量名"的形式进行运算,这很容易产生错误且程序的阅读性较差;另一方面,在主调函数的调用点处,必须用变量的地址作为实参。而引用更容易使用,更清晰。
- 常引用声明方式:const 类型标识符 &引用名=目标变量名;保护原数据不被更改。
- 引用型参数应该在能被定义为const的情况下,尽量定义为const。
1.2返回值
类型标识符 &函数名(形参列表及类型说明)
{函数体}
- 以引用返回函数值,定义函数时需要在函数名前加&
- 用引用返回一个函数值的最大好处是,在内存中不产生被返回值的副本。
- 使用引用的时机。流操作符<<和>>、赋值操作符=的返回值、拷贝构造函数的参数、赋值操作符=的参数、其它情况都推荐使用引用。
参考https://www.cnblogs.com/mlgjb/p/8821340.html
二.STL
2.1vector
- 构造
vector():创建一个空vector vector(int nSize):创建一个vector,元素个数为nSize vector(int nSize,const t& t):创建一个vector,元素个数为nSize,且值均为t vector(const vector&):复制构造函数 vector(begin,end):复制[begin,end)区间内另一个数组的元素到vector中
- 常用函数
增加
void push_back(const T& x):向量尾部增加一个元素X iterator
insert(iterator it,const T& x):向量中迭代器指向元素前增加一个元素x
iterator insert(iterator it,int n,const T& x):向量中迭代器指向元素前增加n个相同的元素x
iterator insert(iterator it,const_iterator first,const_iterator last):向量中 迭代器指向元素前插入另一个相同类型向量的[first,last)间的数据删除 iterator erase(iterator it):删除向量中迭代器指向元素 iterator erase(iterator first,iterator last):删除向量中[first,last)中元素 void pop_back():删除向量中最后一个元素 void clear():清空向量中所有元素 遍历 reference at(int pos):返回pos位置元素的引用 reference front():返回首元素的引用 reference back():返回尾元素的引用 iterator begin():返回向量头指针,指向第一个元素 iterator end():返回向量尾指针,指向向量最后一个元素的下一个位置 reverse_iterator rbegin():反向迭代器,指向最后一个元素 reverse_iterator rend():反向迭代器,指向第一个元素之前的位置 判断函数 bool empty() const:判断向量是否为空,若为空,则向量中无元素 大小函数 int size() const:返回向量中元素的个数 int capacity() const:返回当前向量所能容纳的最大元素值 int max_size() const:返回最大可允许的vector元素数量值 其他函数 void swap(vector&):交换两个同类型向量的数据 void assign(int n,const T& x):设置向量中第n个元素的值为x void assign(const_iterator first,const_iterator last):向量中[first,last)中元素设置成当前向量元素
详情参考:https://www.runoob.com/w3cnote/cpp-vector-container-analysis.html
2.2最小堆,优先队列
//升序队列
priority_queue <int,vector<int>,greater<int> > q;
//降序队列
priority_queue <int,vector<int>,less<int> >q;
定义 priority_queue<Type, Container, Functional>
参考 https://blog.csdn.net/weixin_36888577/article/details/79937886
2.3 string
2.3.1 string::size_type
string::size_type它是一个无符号类型的值,而且能够存放下任何string对象的大小。另外,string类型的索引也是一个size_type类型的。下标运算符 [ ] 接收的就是string::size_type类型。
当我们的程序需要在不同机器或者运行环境中使用的时候,定义为int就不太好,因为对应机器中的int可能较小,出现溢出。另外,如果我们的string特别长,远超int所能表示的范围,那么也是存在问题的。而size_type是一个设计为可以存放任何大小string对象的类型。
原文链接:https://blog.csdn.net/yuanliang861/article/details/82915862
三.algorithm
3.1 sort
语法描述:sort(begin,end,cmp),cmp参数可以没有,如果没有默认非降序排序。begin可看成数组的指针,地址
- 数组排序
升序:sort(begin,end,less());
降序:sort(begin,end,greater()).
sort(a,a+20,greater<int>());
- 一个字符串间的个字符排序:
使用迭代器可以完成顺序排序
使用反向迭代器可以完成逆序排序
string str("hello world");
sort(str.begin(),str.end());
sort(str.rbegin(),str.rend());
- 以结构体为例的二级排序,编写cmp函数
struct link
{
int a,b;
};
bool cmp(link x,link y)
{
if(x.a==y.a)
return x.b>y.b;
return x.a>y.a;
}
int main()
{
link x[4];
for(int i=0;i<4;i++)
cin>>x[i].a>>x[i].b;
sort(x,x+4,cmp);
}
3.2 swap交换
好处:不用担心交换变量精度的缺失,无需构造临时变量,不会增加空间复杂度
swap 包含在命名空间std 里面
swap(a,b);(交换两个数)
swap(a[i] = b[j]);(交换两个位置上的变量)
四.输出输入
4.1字符串单个输入
string a[4];
for(int i=0;i<4;i++)
getline(cin,a[i]);
五.11特性
5.1 NULL和NULLptr
- NULL在C++中就是0,这是因为在C++中void* 类型是不允许隐式转换成其他类型的,所以之前C++中用0来代表空指针,但是在重载整形的情况下,会出现上述的问题。所以,C++11加入了nullptr,可以保证在任何情况下都代表空指针,而不会出现上述的情况,因此,建议以后还是都用nullptr替代NULL吧,而NULL就当做0使用。