C++代码简化之道

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值