C++
目录
STL库函数bool next_permutation(),prev_permutation
abort()、exit()、atexit\atexit使用
STL库函数bool next_permutation(),prev_permutation
next_permutation函数将按字母表顺序生成给定序列的下一个较大的排列,直到整个序列为降序为止。prev_permutation函数与之相反,是生成给定序列的上一个较小的排列。
这是一个求一个排序的下一个排列的函数,可以遍历全排列,要包含头文件< algorithm >。
和sort的参数一样,一般传两个参数,第一个是排列开始的地址,第二个是排列结束的下一个地址。
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int data[4]={5,0,2,4};
do{
for(int i=0;i<4;i++)
cout<<data[i]<<" ";
cout<<endl;
}while(next_permutation(data,data+4));
return 0;
}
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int data[4]={5,0,2,4};
sort(data,data+4); // 从小到大排序
do{
for(int i=0;i<4;i++)
cout<<data[i]<<" ";
cout<<endl;
}while(next_permutation(data,data+4));
return 0;
}
abort()、exit()、atexit\atexit使用
- abort()
立即终止当前进程,产生异常程序终止
进程终止时不会销毁任何对象
- exit()
正常终止进程,并进行清理!
-
atexit (_onexit, _onexit_m)
指定在程序终止之前执行的 exit-processing 函数。 在执行 exit-processing 函数之前不会销毁在调用 atexit
之前初始化的任何全局静态对象。
pair
- pair是C++中一种模板类型。每个pair对象可以存储两个值,这两个值可以是不同的数据类型。存储的值可以是基本数据类型也可以是自定义数据类型。
- #include <utility>
-
定义构造函数
pair<T1, T2> p1; //创建一个空的pair对象(使用默认构造),它的两个元素分别是T1和T2类型,采用值初始化。
pair<T1, T2> p1(v1, v2); //创建一个pair对象,它的两个元素分别是T1和T2类型,其中first成员初始化为v1,second成员初始化为v2。
make_pair(v1, v2); // 以v1和v2的值创建一个新的pair对象,其元素类型分别是v1和v2的类型。
p1 < p2; // 两个pair对象间的小于运算,其定义遵循字典次序:如 p1.first < p2.first 或者 !(p2.first < p1.first) && (p1.second < p2.second) 则返回true。
p1 == p2; // 如果两个对象的first和second依次相等,则这两个对象相等;该运算使用元素的==操作符。
p1.first; // 返回对象p1中名为first的公有数据成员
p1.second; // 返回对象p1中名为second的公有数据成员
- vector的这种用法有点类似于map。与map不同的是:
- map会对插入的元素按键自动排序,而且不允许键重复。
- vector的这种用法不会自动排序,而且允许重复。
- 两个值可以分别用pair的两个公有函数first和second访问
c++成员函数后面跟“:”表示的是赋值,这是c++的特性
A( int aa, int bb ):a(aa),b(bb)
{
}
相当于
A( int aa, int bb )
{
a=aa;
b=bb;
}
typedef 用法
任何声明变量的语句前面加上typedef之后,原来是变量的都变成一种类型。不管这个声明中的标识符号出现在中间还是最后。
例如:
typedef int NUM;
NUM a = 10; //也可以写成NUM(a) = 10;
define 用法详解
1. 无参宏定义
#define 标识符 字符串
举例: MAXNUM就被简单的定义为99999
#define MAXNUM 99999
2.有参宏定义
C++语言允许宏带有参数。在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数。
对带参数的宏,在调用中,不仅要宏展开,而且要用实参去代换形参。
#define 宏名(形参表) 字符串
举例:
#define add(x, y) (x + y)
int main()
{
cout << "1 plus 1 is " << add(1, 1.5) << ".\n";
//输出“1 plus 1 is 2.5.”
system("pause");
return(0);
}
这个“函数”定义了加法,但是该“函数”没有类型检查,有点类似模板,但没有模板安全,可以看做一个简单的模板。define -CSDN
注意:该“函数”定义为(a + b),在这里加括号的原因是,宏定义只是在预处理阶段做了简单的替换,如果单纯的替换为a + b时,当你使用5 * add(2, 3)时,被替换为5 * 2 + 3,值为13,而非5 * (2 + 3),值为25。
c++11 for(auto a:b)
- for(auto a:b)中b为一个容器,效果是利用a遍历并获得b容器中的每一个值,但是a无法影响到b容器中的元素。
- for(auto &a:b)中加了引用符号,可以对容器中的内容进行赋值,即可通过对a赋值来做到容器b的内容填充。