设为首页 加入收藏

TOP

C++11风格的新元素(二)
2019-03-16 22:10:33 】 浏览:142
Tags:风格 元素
一个类型,标准同时为数组提供了begin和end。

vector<int> v;

int a[100];

// C++98

sort( v.begin(), v.end() );

sort( &a[0], &a[0] + sizeof(a)/sizeof(a[0]) );

 

// C++11

sort( begin(v), end(v) );

sort( begin(a), end(a) );

Lambda函数和算法

Lambda函数是决定乾坤的因素,它会使你编写的代码变得更优雅、更快速。Lambda使得STL算法的可用性提高了近100倍。新近开发的C++函数库都是基于lambda可以用的前提(例如,PPL)并且有些函数库甚至要求你编写lambda来调用函数库(例如,C++ AMP)

下面是一个快速示例:找到v里面大于x并且小于y的第一个元素。在C++11中,最简单和干净的代码就是调用一个标准函数。

// C++98: 直接编写一个循环 (使用std::find_if会非常困难)

vector<int>::iterator i = v.begin(); // 因为我们需要在后边用到i

for( ; i != v.end(); ++i ) {

if( *i > x && *i < y ) break;

}

 

// C++11: use std::find_if

auto i = find_if( begin(v), end(v), [=](int i) { return i > x && i < y; } );

想要使用C++编写一个循环或者类似的新特性?不用着急;只要编写一个模板函数(template function)(函数库算法),并且几乎可以将lambda当做语言特性来使用,与此同时会更加灵活,因为它不是固定的语言特性而是一个真正的函数库。

// C#

lock( mut_x ) {

... use x ...

}
// 不使用lambda的C++11:已经非常简洁并且更灵活(例如,可以使用超时以及其他选项)

{

lock_guard<mutex> hold( mut_x );

... use x ...

}

 

// 使用了lambda的C++11可以带一个辅助算法:在C++中使用C#的文法

// 算法:template<typename T, typename F> void lock( T& t, F f ) { lock_guard<T> hold(t); f(); }

lock( mut_x, [&]{

... use x ...

});

去熟悉lambda吧。你会不断用到它,不仅仅在C++中——lambda已经广泛应用于很多主流的编程语言。

Move / &&

Move被认为是copy的最佳优化,尽管它也使得其他事情成为可能比如信息被转发。

// C++98:避免copy的替代方法

vector<int>* make_big_vector(); // 选择1: 返回指针: 没有拷贝,但不要忘记delete

:::

vector<int>* result = make_big_vector();

void make_big_vector( vector<int>& out ); // 选择2: 通过引用传递: 没有拷贝,但是调用者需要传入一个有名对象

:::

vector<int> result;

make_big_vector( result );

 

// C++11: move

vector<int> make_big_vector(); // 通常对于”被调用者(callee)分配的空间“也适用

:::

vector<int> result = make_big_vector();

Move语法改变了我们设计API的方式。我们可以更多地设计通过值传递。为你的类型启用move语法,使用时会比copy更有效。

更多变化

还有更多C++11的特性。并且我计划在未来编写更多深入C++11新特性以及其他特性的短文,我们会知道更多并且喜欢上它。

因为,这是必须知道的新特性。这些特性组成了现代C++风格的核心,使得C++代码看起来和执行时像他们设计的那样,你将会看到这些特性会出现在几乎每一段你看到或者编写的现代C++代码中。并且它们使得现代C++更加干净、安全且快速,使得C++在未来的若干年仍然是我们产业的依靠。

喜欢博主文章并且想学习c/c++编程的小伙伴可以关注笔者微信公众号:C语言编程学习基地,也可以加Q群,648778840一起来交流哦,群内有很多学习资料可免费领取的!对于编程的初学者来说会特别有用的!另外笔者也会在Q群里面进行视频教学,大家有兴趣的可以来哦!

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇简单数学(组合数+求数列通项公式.. 下一篇C++数组排序

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目