1. 善用emplace
C++11开始STL容器出现了emplace
(置入)的语义。比如 vector、map、unordered_map,甚至 stack和 queue都有。
emplace方便之处在于,可以用函数参数自动构造对象,而不是向vector的push_back,map的insert那样传入一个构造好的对象。
举个例子,比如有这么一个对象。
class Point {
public:
Point(int x, int y):_x(x),_y(y){}
private:
int _x;
int _y;
};
C++11之前。大概的写法
std::vector<Point> vp;
std::map<std::string, Point> mp;
Point p(1, 2);
vp.push_back(p);
vp.push_back(Pointer(3, 4));
Point p1(10, 20);
mp.insert(std::pair<std::string, Point>("key1", p1));
Point p2(100, 200);
mp.insert(std::make_pair("key2", p2));
C++11之后:
std::vector<Point> vp;
std::map<std::string, Point> mp;
vp.emplace_back(1, 2);
vp.emplace_back(3, 4);
Point p1(10, 20);
Point p2(100, 200);
mp.emplace("key1", p1);
mp.emplace("key2", p2);
注意,其实也不需要无脑使用emplace_back。比如,当你的使用场景中,已经确切存在了一个Point的对象,你需要把它放进vector:
// 彼时,你已经有了一个Point的对象p。不需要自己凭空构造。
vp.push_back(p);
vp.emplace_back(p);
这种情况下,两种写法的表现几乎无差别(push_back反而短……当然可能也没必要追求这个)。见过一些老项目升级C++11之后,无脑给push_back全替换成emplace_back的。虽然也没啥问题,但其实有时候没必要。
当然,当需要从参数来构造出对象的时候。那么 emplace_back明显会简洁许多。但此时push_back其实除了代码冗长外,其性能开销也没有比emplace_back高太多,因为
vp.push_back(Pointer(3, 4));
调用的是:
void push_back (value_type&& val);
有较真的网友提到 emplace的置入功能,还是要比这种push_back (value_type&& val)稍胜一筹,anyway。两个函数实现逻辑不同,肯定无法做到性能完全一致,但是也没到足以影响自己编码习惯的地步。总而言之当要放入 vector的对象不存在的时候,直接用 emplace_back来构造,在已存在的时候用 emplace_back或 push_back都可以。
2. 在不影响可读性的情况下使用auto,区分auto& 、auto&&
auto不多解释了。
很多C++程序员被问『熟悉C++11吗?说一说』
答一个『auto』
没啦
auto就是用来简化长类型的(比如命名空间嵌套曾经很深)。另外auto&和auto&&(万能引用)也不多解释了。
当然滥用auto也会造成代码可读性变差。在我等不用IDE,用vim开发C++的程序员面前,auto滥用犹如噩梦。没有类型提示啊。
3. lambda表达式替换手写函数和函数对象
lambda表达式(或者说lamb