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 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 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