C++11新特性 - 关键字、容器
程序员文章站
2022-10-27 15:31:25
1,关键字:
>>>>>>>>>auto在c98中已经存在,只是作用不大且多余<<<<<<<<...
1,关键字:
>>>>>>>>>auto在c98中已经存在,只是作用不大且多余<<<<<<<<<<<< c11中auto可以在声明变量的时候根据变量初始值的类型自动为此变量选择匹配的类型: int a = 10; auto au_a = a; //自动类型推断,au_a为int类型 cout << typeid(au_a).name() << endl;//======>>>>int 类型推断发生在编译时期 int main() { std::vector vs; for (auto i = vs.begin(); i != vs.end(); i++) { ... } } 如果在使用模板时候,不知道函数的返回值,可以通过auto关键字作为返回值进行推 注意点: 1>auto 变量必须在定义时初始化,这类似于const关键字 2>定义在一个auto序列的变量必须始终推导成同一类型 3>如果初始化表达式为const或volatile(或者两者兼有),则除去const/volatile语义 4>如果auto关键字带上&号,则不去除const语意,如: const int a2 = 10; auto &b2 = a2;//因为auto带上&,故不去除const,b2类型为const int b2 = 10; //非法 5>初始化表达式为数组时,auto关键字推导类型为指针 6>若表达式为数组且auto带上&,则推导类型为数组类型 7>auto仅仅是一个占位符,它并不是一个真正的类型,不能使用一些以类型为操作数的操作符,如sizeof或者typeid >>>>>>>>>>>>>>>>nullptr<<<<<<<<<<<<<<<< 用于识别空指针: null ===> void * nullptr ===> char *
2.容器
1.std::array ==> 定长数组(比自定义的安全),封装了迭代器 由于是定长的,所以不支持增加和删除元素 2.std::forward_list为从++新增的线性表,与list区别在于它是单向链表。我们在学习数据结构的时候都知道,链表在对数据进行插入和删除是比顺序存储的线性表有优势,因此在插入和删除操作频繁的应用场景中,使用list和forward_list比使用array、vector和deque效率要高很多。(比list占用内存少,但是只能单向遍历) 3.std::unordered_map与std::map用法基本差不多,但是不排序,但stl在内部实现上有很大不同,std::map使用的数据结构为红黑树,而std::unordered_map内部是哈希表的实现方式,哈希map理论上查找效率为o(1)。但在存储效率上,哈希map需要增加哈希表的内存开销。 4.std::unordered_set的数据存储结构也是哈希表的方式结构,除此之外,std::unordered_set在插入时不会自动排序,这都是std::set表现不同的地方。
3.多线程
std::thread为c++11的线程类,使用方法和boost接口一样,非常方便,同时,c++11的std::thread解决了boost::thread中构成参数限制的问题,我想着都是得益于c++11的可变参数的设计风格。
可以使用多线程,所以会产生线程安全问题====>>>>
std::atomic为c++11分装的原子数据类型。
能直接用在多线程中而不必我们用户对其进行添加互斥资源锁的类型。从实现上,大家可以理解为这些原子类型内部自己加了锁。
4.智能指针
shared_ptr强智能指针: 1、std::make_shared封装了new方法,boost::make_shared之前的原则是既然释放资源delete由智能指针负责,那么应该把new封装起来,否则会让人觉得自己调用了new,但没有调用delete,似乎与谁申请,谁释放的原则不符。c++也沿用了这一做法。 2、随着引用对象的增加std::shared_ptr p2 = p1,指针的引用计数有1变为2,当p2退出作用域后,p1的引用计数变回1,当main函数退出后,p1离开main函数的作用域,此时p1被销毁,当p1销毁时,检测到引用计数已经为1,就会在p1的析构函数中调用delete之前std::make_shared创建的指针。 weak_ptr弱智能指针: std::weak_ptr有什么特点呢?与std::shared_ptr最大的差别是在赋值是,不会引起智能指针计数增加。 若两个shared_ptr相互引用,那么会产生无法析构问题,weak_ptr就能解决这个问题,强弱相互调用。