1.右值引用

右值引用 (Rvalue Referene) 是 C++ 新标准 (C++11, 11 代表 2011 年 ) 中引入的新特性 , 它实现了转移语义 (Move Sementics) 和精确传递 (Perfect Forwarding)。
它的主要目的有两个方面:
消除两个对象交互时不必要的对象拷贝,节省运算存储资源,提高效率。能够更简洁明确地定义泛型函数。
C++( 包括 C) 中所有的表达式和变量要么是左值,要么是右值。通俗的左值的定义就是非临时对象,那些可以在多条语句中使用的对象。
所有的变量都满足这个定义,在多条代码中都可以使用,都是左值。 右值是指临时的对象,它们只在当前的语句中有效。
int i = 0;  // 在这条语句中,i 是左值,0 是临时值,就是右值。
在C++11之前,右值是不能被引用的,如:
int &a = 1;   // error C2440: “初始化”: 无法从“int”转换为“int &”
在C++11中,我们可以引用右值,使用&&来实现:
int &&a = 1;
右值引用常与move同时使用(待补充

2.auto遍历容器

  1. 拷贝range的元素时,使用for(auto x : range).

  2. 修改range的元素时,使用for(auto && x : range).

  3. 只读range的元素时,使用for(const auto & x : range).

3.##与#🙈

使用#把宏参数变为一个字符串,用##把两个宏参数贴合在一起.
#是连接字符串的,##是粘合成一个名字的。
#include <iostream>  
using namespace std;  
#define F(x, y) x##y 
#define F2(x) cout<< "C"#x#x <<endl 	//注意字符串是要加引号的  int main()  
{  
    int len = 0;  
    F(l, en) = 1;  //相当于将len重新赋值了
    cout << len << endl; //输出1
    //int lnln = 0;
    //F2(l, n) = 1;	//报错,error: use of undeclared identifier 'l'
 
    F2(P);	//输出CPP
 
  
    return 0;  
}  

#include<cstdio>
#include<climits>
using namespace std;
#define STR(s)     #s
#define CONS(a,b)  int(a##e##b)
int main()
{
   printf(STR(vck));           // 输出字符串"vck"
   printf("%d\n", CONS(2,3));  // 2e3 输出:2000
   return 0;
}
注意:
当宏参数是另一个宏的时候,需要注意的是凡宏定义里有用’#’或’##’的地方宏参数是不会再展开.
即, 只有当前宏生效, 参数里的宏不会生效 

4.typedef typename


5.全排列函数next_permutation(注意使用前排序✍)

next_permutation函数将按字母表顺序生成给定序列的下一个较大的排列,直到整个序列为降序为止。
prev_permutation函数与之相反,是生成给定序列的上一个较小的排列。
这是一个求一个排序的下一个排列的函数,可以遍历全排列,要包含头文件<algorithm>
使用时注意复杂度问题,n个不相同的数字的全排列 O(n !)
使用方法:next_permutation(数组头地址,数组尾地址);若下一个排列存在,则返回真,如果不存在则返回假
int main()
{
    int num = 1,a[6]= {1,2,3,4,5};
    while(next_permutation(a,a+5))
    {
        for(int i=0; i<5; i++)
            cout<<a[i]<<" ";
        if(num==5)
            break;
        num++;
        cout<<endl;
    }
    return 0;
}

6. random_shuffle() 随机排序

函数原型:
template<class RandomAccessIterator>
void random_shuffle(
   RandomAccessIterator _First, //指向序列首元素的迭代器
   RandomAccessIterator _Last  //指向序列最后一个元素的下一个位置的迭代器
);

试用范围:一般是vector这种连续型可任意访问的容器,string或者数组也能使用。对于set、map(自带排序功能)的容器或者非连续性容器无法使用。
依然是拿来暴力水数据。。





.2