C++11标准库-新特性

来源:互联网 发布:手机淘宝里怎么买彩票 编辑:程序博客网 时间:2024/06/04 17:54

来自于C++标准库第二版,侯捷翻译 的那本。本文主要是简要总结,还有一点看不太懂的地方,会只有一个简要说明
1.vector<vector<int>> v,这里不需要把两个>>分开也不会报错,
老标准会报错,必须分开写,> >
2,新的空指针,int *p = nullptr,作用于
void f(int);
void f(int*)
f(0)
f(NULL),
f(nullptr)
,此种情况个人认为大为有用,具体类型std::nullptr_t ,还未了解,
3,auto自动推到
与以往的auto应当完全不一样了,
auto i = 42;
double fun();
auto i = fun();
auto i;//错误,如同引用类似,必须有明确类型方能推导
vector v;
auto pos = v.begin();
auto pos = v;
for(auto pos : v)
{
cout << *pos << endl;//错误,pos是vector pos;
}
auto可以推导lambda类型
auto l = [](int x)->bool{return false;}
个人觉得auto可以用在如遍历这样不需要了解细致的场合,其他场合还是明确类型较好些
typeid(变量).name(),查看类型
更多的初始化方式
int value[] = {1,2,4};
vector v{1,2,4};
这种适合这种序列式的初始化,至少书中之说了这两个例子,
但是注意,初始化的类型必须一致,
int value[]{1,2.5};//错误
4,全新的for循环,
int value{1,2,3};
for(auto pos :value)
{},另外例子2中有一个说明
5 move语义,老实讲,我看的一头雾水,主要讲搬迁和拷贝的性能影响,不太明白最终要我们怎么去做,所以只能暂时忽略,
6,新的字符串,这个举例非常简单,但也只是做了概括,变动应当不小,后面的章节应当有详细解释,所以暂时忽略
7 noexcept,不抛出异常,
void fun()noexcept(),还举了一个稍微复杂的例子

void swap(Types& x,Types& y)noexcept(noexcept(x.swap(y)))
{}
`这个意思大概是设定条件,如果符合就不抛出异常,noexcept(x.swap),小括号里不可抛出异常就会产生true,
另外说C++11不鼓励使用异常

8,constexpr让表达式核定于编译时
constexpr int fun(int x)
{
return x*x;
}
float arr[fun(5)];//C++11,可以这么做,但总是觉得有点别扭,使用这样的代码总是觉得有点不安全的感觉
另外可以:

array<float, numeric_limits<short>::max()> a;//尽管没见过constexpr string str = "hello";//错误的,不太明白为什么,可能和编译时产生有些关系?

9 lambda类型,觉得它像个函数,调用时要加()
定义:[外部参数] (参数)->返回类型 {…}
外部参数可有可无,参数可有可无,返回类型可有可无,
如:[]{},
auto l = []{cout << "hello" << endl;}
auto l = [](int x){ cout << x << endl;}

l(5);

[]()->double{return 42;}//返回类型double
传递使用外部参数    int x = 10;    int y = 20;    auto l = [=,&y]()//声明,y是引用传递,其他则是值传递[x,y]也是可以的,    {    //内部无论是否在[]声明使用谁,可以使用外部变量,但若非&,那么就是值传递,不得做更改操作,如果是&传递,像y,可以做任何操作,        y = y + 10;        cout << x << endl;        y = x + y;    //  x = x + 10;//错误    };    cout << y << endl;    l();//调用    cout << y << endl;
//  lambda作为返回类型,使用C++标准库#include <functional>function<int(int, int)> returnlambda(){return [] (int x,int y){return x*y;};}int main(){auto lf = returnlambda();cout << lf(5,6) << endl;}

auto 搭配lambda算是物尽其用了,否则个人还是认为一般情况下明确类型的好,

10.模板
其实到目前为止,工作中从未写过模板,其实C++好些机制几乎都用不到,这是题外话,模板支持不定参数

template<class T,typename...Types>//...就是不定参数,Types只是个名字void print(const T& t,Types...name){    cout << t << endl;    cout << name << endl;}

另外还举例了一个别名模板(或者叫模板重定义),没太明白,暂时不说,将来明白后再回来修改本日志,本书还单独拿出了一节来叙述模板的一些特性,并非新加的特性,虽然没用过,也忘的差不多了,但一直都觉得模板绝对是个好东西,谨记模板是个好东西,而且模板的类型一定要匹配,
11 新类型

char16_t t;    char32_t t2;    long long int a;    unsigned long long b;    int* p = nullptr;    nullptr_t p;//暂时不明,sizeof(p) == 4;    int i;    int i = int();//初始化0    int i{};//全新的初始化方式0,真不知道增加这个弱智东西有什么意义,

12 decltype 新的关键字
并不是很理解这个关键字的大用处究竟在什么地方,声明返回类型,我可以直接auto就可以,很难想象场景,认知太浅薄,因为从未使用C++11的代码

vector<int> v;    decltype(v)::value_type p;//找出类型template<class T>①decltype(x + y) fun(T x, T y)//可以声明返回类型{    return x + y;}②template<typename T1,typename T2>auto fun(T1 x,T2 y)->decltype(x+y)//返回声明类型{},两种写法意思相同,看书的时候差点搞混了,只是第二种仅仅是类似lambda写法,并不是返回lambda类型,因为lambda是[]{}这样的语法,这又是一个弱智的做法,发明第二种这种奇怪的写法,意义究竟在哪里,简直就是画蛇添足!茴香豆的茴有四种写法,你都知道么。。。

13 新的枚举类型,但不是很理解
enum class S:char{mr,ms,co};//可以指定类型char
还不是很明白使用场景,介绍也很简略,
https://www.cnblogs.com/diegodu/p/6169808.html,搜到了一个详细说明,可以自己搜一下改变在哪里,暂时先写到这里

总结,本文所有东西均出自《C++标准库第二版》,一切从头开始学习

原创粉丝点击