C++11 特性学习

http://www.360doc.com/content/18/0320/13/53679236_738700085.shtml

1.1、auto 

    编译器根据上下文情况,确定auto变量的真正类型。

    auto a = 10;//int

    auto作为函数返回值时,只能用于定义函数,不能用于声明函数。

    不要函数定义,直接在cpp中实现,即可。

1.2、nullptr 关键字及用法

    nullptr ? NULL

    NULL的类型不够安全。函数重载中null,可以赋值给int参数;

1.3、for 循环语法

    使用迭代器的方法使用循环。


2、STL 容器

2.1、std::array

    std::array相对于数组,增加了迭代器等函数(接口定义可参考C++官方文档)


2.2、std::forward_list

    std::forward_list为从++新增的线性表,与list区别在于它是单向链表。我们在学习数据结构的时候都知道,链表在对数据进行插入和删除是比顺序存储的线性表有优势,因此在插入和删除操作频繁的应用场景中,使用list和forward_list比使用array、vector和deque效率要高很多。


2.3、std::unordered_map

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


2.4、std::unordered_set

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

//示例代码1.0 http://www.cnblogs.com/feng-sc/p/5710724.html

int main()

{

    std::unordered_set <intunorder_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  std::endl;

    }

    std::setintset;

    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  std::endl;

    }

}

3、多线程

在C++11以前,C++的多线程编程均需依赖系统或第三方接口实现,一定程度上影响了代码的移植性。C++11中,引入了boost库中的多线程部分内容,形成C++标准,形成标准后的boost多线程编程部分接口基本没有变化,这样方便了以前使用boost接口开发的使用者切换使用C++标准接口,把容易把boost接口升级为C++接口。

3.1、std::thread

    

std::thread为C++11的线程类,使用方法和boost接口一样,非常方便,同时,C++11的std::thread解决了boost::thread中构成参数限制的问题,我想着都是得益于C++11的可变参数的设计风格。


//示例代码1.0 http://www.cnblogs.com/feng-sc/p/5710724.html

void threadfun1()

{

    std::cout 'threadfun1 - 1rn'  std::endl;

    std::this_thread::sleep_for(std::chrono::seconds(1));

    std::cout 'threadfun1 - 2'  std::endl;

}

 

void threadfun2(int iParam, std::string sParam)

{

    std::cout 'threadfun2 - 1'  std::endl;

    std::this_thread::sleep_for(std::chrono::seconds(5));

    std::cout 'threadfun2 - 2'  std::endl;

}

 

int main()

{

    std::thread t1(threadfun1);

    std::thread t2(threadfun2, 10, 'abc');

    t1.join();

    std::cout 'join'  std::endl;

    t2.detach();

    std::cout 'detach'  std::endl;

}

    有以上输出结果可以得知,t1.join()会等待t1线程退出后才继续往下执行,t2.detach()并不会把 detach字符输出后,主函数退出,threadfun2还未执行完成,但是在主线程退出后,t2的线程也被已经被强退出。

3.2、std::atomic

    std::atomic为C++11分装的原子数据类型。

    什么是原子数据类型?

    从功能上看,简单地说,原子数据类型不会发生数据竞争,能直接用在多线程中而不必我们用户对其进行添加互斥资源锁的类型。从实现上,大家可以理解为这些原子类型内部自己加了锁。

    我们下面通过一个测试例子说明原子类型std::atomic_int的特点。

//示例代码1.0 http://www.cnblogs.com/feng-sc/p/5710724.html

std::atomic_bool bIsReady = false;

std::atomic_int iCount = 100;

void threadfun1()

{

    if (!bIsReady) {

        std::this_thread::yield();

    }

    while (iCount > 0)

    {

        printf('iCount:%drn', iCount--);

    }

}

 

int main()

{

    std::atomic_bool b;

    std::list lstThread;

    for (int i = 0; i 10; ++i)

    {

        lstThread.push_back(std::thread(threadfun1));

    }

    for (autoth : lstThread)

    {

        th.join();

    }

}

3.3、std::condition_variable

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

4、智能指针内存管理

在内存管理方面,C++11的std::auto_ptr基础上,移植了boost库中的智能指针的部分实现,如std::shared_ptr、std::weak_ptr等,当然,想boost::thread一样,C++11也修复了boost::make_shared中构造参数的限制问题。把智能指针添加为标准,个人觉得真的非常方便,毕竟在C++中,智能指针在编程设计中使用的还是非常广泛。

简单地说,智能指针只是用对象去管理一个资源指针,同时用一个计数器计算当前指针引用对象的个数,当管理指针的对象增加或减少时,计数器也相应加1或减1,当最后一个指针管理对象销毁时,计数器为1,此时在销毁指针管理对象的同时,也把指针管理对象所管理的指针进行delete操作。

如下图所示,简单话了一下指针、智能指针对象和计数器之间的关系:



下面的小章节中,我们分别介绍常用的两个智能指针std::shared_ptr、std::weak_ptr的用法。

5.1、std::function、std::bind 封装可执行对象

5.2、lamda 表达式


在众多的C++11新特性中,个人觉得lamda表达式不仅仅是一个语法新特性,对于没有用过java或C#lamda表达式读者,C++11的lamda表达式在一定程度上还冲击着你对传统C++编程的思维和想法。


我们先从一个简单的例子来看看lamda表达式:


//示例代码1.0 http://www.cnblogs.com/feng-sc/p/5710724.html

int main()

{

    auto add[](int a, int b)->int{

        return a + b;

    };

    int ret = add(1,2);

    std::cout <>'ret:' <>ret <>std::endl;

    return 0;

}


解释:


第3至5行为lamda表达式的定义部分


[]:中括号用于控制main函数与内,lamda表达式之前的变量在lamda表达式中的访问形式;


(int a,int b):为函数的形参


->int:lamda表达式函数的返回值定义


{}:大括号内为lamda表达式的函数体。

5.another :http://blog.csdn.net/liujuan0827/article/details/73480313










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值