标签:而不是 变量 表达式 queue ptr 相同 引用 未命名 实现
访问成员函数返回的是引用,front,back,at,和下表,如果一个容器是const,返回的则是const的引用,如果容器不是const,则返回的是普通引用。
是否返回的是引用,关键是看表达式在左值还是在右值,如果在右值,返回的就是元素的一个拷贝,如果在左值,返回的是一个引用对象。
在使用auto的时候,如果想改变该变量的值,要定义成引用类型。
这里指的指针,引用,迭代器实效,说的是可能改变容器的大小。
删除元素的成员函数并不检测其删除参数,在删除元素之前,应该确保它们是存在的。
auto的自动推断类型发生在编译器,因此,auto并不会造成程序运行效率的低下。
在未使用auto的时候,编译器同样需要得知右操作数的类型,然后在与左操作数类型进行比较,检查是否可以发生相应的转化,是否需要进行隐式类型转化。
在使用auto的时候,如果表达式中有引用的含义,则会去除引用的含义,直接对应最原始的数据类型,
auto会去除顶层const,如果auto带上引用,则不会去除const修饰符所带来的作用。
初始值为数组,则使用auto得到的是指针类型,如果带上&,则推导类型为数组类型。
auto并不是一个真正的类型,而是一个占位符,因此不能使用一些以类型为操作数的操作符,如sizeof或者是typeid。
在使用forword_list的时候,需要用到两个迭代器对象,一个是要操作的元素,另外一个是该元素前驱元素。
标准库中的array不支持resize操作,其他的resize操作都是在原来容器的基础之上。
shrink_to_fit仅仅是一个请求,编译器并不一定保证会真正的回退内存空间。
栈默认是基于deque来进行实现的,也可以在list和vector上面实现。
每个适配器都是根据底层来实现自己的操作,不可以直接使用底层操作,这里相当于是对底层操作的一个限制。
queue默认也是基于deque来实现的。
priority_queue是基于vector来实现的。
标准库算法是对迭代器进行操作而不是对容器进行操作,因此,算法并不能直接对容器进行增删
C++中的可调用对象有函数,函数指针,操作符重载,以及使用lambda表达式。
lambda表达式所具有的形式:
[捕获列表](参数列表) -> 返回类型 {函数体}
其中捕获列表是在函数体中定义的局部变量的列表,通常为空,
lambda必须使用尾置返回用来指定其返回类型。
我们可以忽略参数列表和返回类型,但必须永远包括捕获列表和函数体
在lambda表达式中,忽略括号和参数列表等价于定义一个空参数列表,如果忽略返回类型,会自动根据函数体中的代码推断出返回类型。如果函数体中包含return语句,则根据来推断,否则,返回void类型。
lambda表达式不能有默认参数,lambda表达式的实参数目必须和形参数目相同,一旦形参初始化完毕,就可以直行函数体了。lambda就像是一个匿名的内联函数。
捕获列表的存在使得,函数体内可以访问捕获列表中的值。
当定义一个lambda的时候,编译器会生成一个对应新的未命名的类类型,当向一个函数传递lambda的时候,同时定义了一个新类型,和一个该类型的对象,传递的参数就是此编译器生成该类类型的未命名的对象,类似的,当使用auto定义一个用lambda初始化的变量,定义了一个从lambda生成的类型的对象。
默认情况下,由lambda生成的对象,都包含用lambda捕获列表所捕获变量的数据成员,类似于普通函数,lambda的数据成员在lambda对象被创建的时候进行初始化。
被捕获的值是在lambda创建时拷贝,而不是调用时拷贝。
使用bind(functional头文件中)可以,扩展函数调用时候的参数(前提是参数的值是固定的)
bind函数甚至是可以重新安排参数的顺序
对于IO流的对象来讲,只能使用引用类型。
可以通过ref标准库中的函数,返回给定对象的引用,这个对象是可以拷贝的。标准库中有一个cref函数,生成一个保存const引用的类,这两个函数也位于functional头文件中。
容器这一块,需要自己来慢慢参考算法来进行实现
动态内存管理
永远不要用get()方法返回的指针为其他只能指针赋值,这样会导致有多个只能指针指向同一块内存空间,从而使得,任何一个只能指针的引用为0,都会将这块内存空间给释放掉,因此,另外的指针所指向的内存空间也被释放掉了,这就会导致空悬指针。
只能指针的一种类型有,shared_ptr,也是用模板类定义的
智能指针使用的条件限制:
不使用相同的内置指针初始化多个智能指针
不delete get()返回的指针。
不适用get()初始化后者是reset另一个智能指针
如果使用了get()返回的指针,当最后一个智能指针被销毁以后,你的指针就变得无效了。
如果智能指针管理的资源不是new分配的内存,记得传递一个删除器,用来专门释放相应的内存资源。
标签:而不是 变量 表达式 queue ptr 相同 引用 未命名 实现
原文地址:http://www.cnblogs.com/andyniu/p/7905080.html