C 代碼簡化之道
本文會介紹10個(gè)條款,后續(xù)還會陸續(xù)更新相關(guān)的內(nèi)容,請大家持續(xù)關(guān)注!
1. 善用emplace
C 11開始STL容器出現(xiàn)了emplace
(置入)的語義。比如 vector、map、unordered_map,甚至 stack和 queue都有。emplace方便之處在于,可以用函數(shù)參數(shù)自動構(gòu)造對象,而不是向vector的push_back,map的insert那樣傳入一個(gè)構(gòu)造好的對象。舉個(gè)例子,比如有這么一個(gè)對象。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);
注意,其實(shí)也不需要無腦使用emplace_back。比如,當(dāng)你的使用場景中,已經(jīng)確切存在了一個(gè)Point的對象,你需要把它放進(jìn)vector://?彼時(shí),你已經(jīng)有了一個(gè)Point的對象p。不需要自己憑空構(gòu)造。
vp.push_back(p);
vp.emplace_back(p);
這種情況下,兩種寫法的表現(xiàn)幾乎無差別(push_back反而短……當(dāng)然可能也沒必要追求這個(gè))。見過一些老項(xiàng)目升級C 11之后,無腦給push_back全替換成emplace_back的。雖然也沒啥問題,但其實(shí)有時(shí)候沒必要。當(dāng)然,當(dāng)需要從參數(shù)來構(gòu)造出對象的時(shí)候。那么 emplace_back明顯會簡潔許多。但此時(shí)push_back其實(shí)除了代碼冗長外,其性能開銷也沒有比emplace_back高太多,因?yàn)?/p>vp.push_back(Pointer(3,?4));
調(diào)用的是:void?push_back?(value_type