c++11新特性

参考

1、关键字及新语法
1.1、auto关键字及用法

Auto
早期c/c++是具有自动存储期的局部变量;
在c++11中属于一个类型声明的占位符,同时auto声明的变量必须初始化,以便编译器能通过初始化表达式推出其变量类型;
优点:
(1)在拥有初始化表达式的复杂类型变量时声明简化了代码
(2)避免了声明类型时发生的声明类型错误
(3)在C++中的一定程度能够支持泛型的编程,可以达到代码的跨平台效果
注意事项:
(1)auto声明的变量必须初始化
(2)auto不能同其他组合类型连用
(3)auto属于一个占位符,不属于类型,所以不能用于类型转换以及sizeof
(4)函数参数和模板参数不可以声明为auto类型
(5)auto会退化成指向数组的指针,除非被声明为引用
Int arr[10];
auto j = a;(typied(arr).name = int * )
auto k = &a;(typied(arr).name = int [] )
(6)auto作函数返回值,必须是用于定义函数,不能用于声明函数

1.2、nullptr关键字及用法

使用nullptr代替NULL的原因:

  1. NULL在c中属于一个宏:#define NULL ((void*)0)
  2. C++中为了解决重载的问题,将NULL定义为0;
    nullptr则是用于标识空指针,属于一个关键字,可以转化成任何指针类
    型和bool类型,但不能用于转换成常数;
  3. 引入nullptr是为了解决NULL在C++中不知道调用哪个函数的问题
    Void Test(int a) void Test(int *a)
    { {
    //调用的是NULL //调用的是nullptr
    } }

1.3func,static_assert,final,override关键字

func:
用于获得当前函数名字符串的宏
const char * Stanard_Macros(void)
{
return func; //返回值:Stanard_Macros
}
static_assert:
断言来解决问题,它支持两个参数输入,一个是返回bool型的表达式,另一个是警
告信息。
final和override控制
final用来限制基类虚函数的对应的派生类不能重写该虚函数,从而避免了某些接口被
重写覆盖;
override则指定了函数必须重载基类的虚函数,否则编译通不过,这就避免了某些输
入名或者原型不匹配等错误的发生

1.4 for循环语法

for循环:
基于范围的迭代写法
// & 启用了引用,改变后的vector中的遍历
for(auto &i : arr)
{
std::cout << i << std::endl;
}

2、STL容器

2.1、std::array

std::array 保存在栈内存中,相比堆内存中的 std::vector,我们能够灵活的访问这里面
的元素,从而获得更高的性能。
std::array 会在编译时创建一个固定大小的数组,std::array 不能够被隐式的转换成指
针,使用 std::array只需指定其类型和大小即可

2.2、std::forward_list

std::forward_list 是一个列表容器,使用方法和 std::list 基本类似。
和 std::list 的双向链表的实现不同,std::forward_list 使用单向链表进行实现,提供了
O(1) 复杂度的元素插入,不支持快速随机访问(这也是链表的特点),也是标准库容
器中唯一一个不提供 size() 方法的容器。当不需要双向迭代时,具有比 std::list 更高的
空间利用率。

2.3、std::unordered_map

std::unordered_map与std::map用法基本差不多,但STL在内部实现上有很大不同,std::map使用的数据结构为二叉树,而std::unordered_map内部是哈希表的实现方式,哈希map理论上查找效率为O(1)。但在存储效率上,哈希map需要增加哈希表的内存开销。

//webset address: http://www.cplusplus.com/reference/unordered_map/unordered_map/bucket_count/
#include <iostream>
#include <string>
#include <unordered_map>
int main()
{
    std::unordered_map<std::string, std::string> mymap =
    {
        { "house","maison" },
        { "apple","pomme" },
        { "tree","arbre" },
        { "book","livre" },
        { "door","porte" },
        { "grapefruit","pamplemousse" }
    };
    unsigned n = mymap.bucket_count();
    std::cout << "mymap has " << n << " buckets.\n";
    for (unsigned i = 0; i<n; ++i) 
    {
        std::cout << "bucket #" << i << " contains: ";
        for (auto it = mymap.begin(i); it != mymap.end(i); ++it)
            std::cout << "[" << it->first << ":" << it->second << "] ";
        std::cout << "\n";
    }
    return 0;
}

运行结果
在这里插入图片描述

2.4、std::unordered_set

std::unordered_set的数据存储结构也是哈希表的方式结构,除此之外,std::unordered_set在插入时不会自动排序,这都是std::set表现不同的地方。

//示例代码1.0 http://www.cnblogs.com/feng-sc/p/5710724.html#include <iostream>
#include <string>
#include <unordered_set>
#include <set>
int main()
{
    std::unordered_set<int> unorder_set;
    unorder_set.insert(7);
    unorder_set.insert(5);
    unorder_set.insert(3);
    unorder_set.insert(4);
    unorder_set.insert(6);
    std::cout << "unorder_set:" << std::endl;
    for (auto itor : unorder_set)
    {
        std::cout << itor << std::endl;
    }

    std::set<int> set;
    set.insert(7);
    set.insert(5);
    set.insert(3);
    set.insert(4);
    set.insert(6);
    std::cout << "set:" << std::endl;
    for (auto itor : set)
    {
        std::cout << itor << std::endl;
    }
}

运行结果
在这里插入图片描述

3、多线程

3.1、std::thread

解决了boost::thread中构成参数限制的问题

3.2、st::atomic

C++11中封装的原子数据类型(原子数据类型:不会发生数据竞争,能够直接使用在多线程中不需要加解锁的过程

3.3、std::condition_variable

C++11中的std::condition_variable就像Linux下使用pthread_cond_wait和pthread_cond_signal一样,可以让线程休眠,直到别唤醒,现在在从新执行。线程等待在多线程编程中使用非常频繁,经常需要等待一些异步执行的条件的返回结果。

4、智能指针内存管理

4.1、std::shared_ptr

shared_ptr:引用了计数器,当为0时(即无对象引用这块内存时,释放掉这块
内存)

4.2、std::weak_ptr

weak_ptr:解决了shared_ptr中循环引用的问题,与shared_ptr搭配使用

4.3 std::auto

auto_ptr:有所有权唯一的问题

4.4 std::unique_ptr

unique_ptr:不能进行赋值拷贝的问题

5、其他

5.1、2、初始化对象:

C++11 提供了统一的语法来初始化任意的对象;
C++11 还把初始化列表的概念绑定到了类型上,并将其称之为 std::initializer_list,
允许构造函数或其他函数像参数一样使用初始化列表,这就为类对象的初始化与普
通数组和 POD 的初始化方法提供了统一的桥梁。
#include <initializer_list>
class Magic {
public:
Magic(std::initializer_list list) {}
};
Magic magic = {1,2,3,4,5};
std::vector v = {1, 2, 3, 4};

5.2、lamda表达式

实际上就是提供了一个类似匿名函数的特性,而匿名函数则是在需要一个函数,但是又不想费力去命名一个函数的情况下去使用的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值