一个类型,标准同时为数组提供了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群里面进行视频教学,大家有兴趣的可以来哦!