C 優化之使用emplace

2021-08-04 02:29:30 字數 2657 閱讀 7118

在c++開發過程中,我們經常會用stl的各種容器,比如vector,map,set等,這些容器極大的方便了我們的開發。在使用這些容器的過程中,我們會大量用到的操作就是插入操作,比如vector的push_back,map的insert,set的insert。這些插入操作會涉及到兩次構造,首先是物件的初始化構造,接著在插入的時候會複製一次,會觸發拷貝構造。但是很多時候我們並不需要兩次構造帶來效率的浪費,如果可以在插入的時候直接構造,就只需要構造一次就夠了。

c++11標準已經有這樣的語法可以直接使用了,那就是emplace。vector有兩個函式可以使用:emplace,emplace_back。emplace類似insert,emplace_back類似push_back。通過示例**可以更清晰的了解到他們的區別。

// book結構,儲存書本資訊

struct sbook

sbook(std::string bookname_, int price_) : bookname(bookname_), price(price_)

; sbook(sbook& rhs) : bookname(rhs.bookname), price(rhs.price)

~sbook()

bool operator

std::string bookname;

int price;

}; // 測試vector

vectorbooks;

// 預先分配,否則整個vector在容量不夠的情況下重新分配記憶體

books.reserve(100);

std::cout << "test push_back:" << endl;

books.push_back(sbook("c++從入門到放棄", 1));

std::cout << endl;

std::cout << "test emplace_back:" << endl;

books.emplace_back("水滸傳", 2);

std::cout << endl;

std::cout << "test emplace_back default:" << endl;

books.emplace_back();

auto& book = books.back();

book.bookname = "紅樓夢";

book.price = 5;

std::cout << endl;

std::cout << "test emplace:" << endl;

auto it = books.emplace(books.end());

it->bookname = "西遊記";

it->price = 3;

std::cout << endl;

std::cout << "output all books: " << endl;

for_each(books.begin(), books.end(), (const sbook& book)->void

); std::cout << endl;​​​​

// 測試set

setbookset;​

​std::cout << "test bookset insert:" << endl;

bookset.insert(sbook("十萬個為什麼", 1));

std::cout << endl;

​​std::cout<< "test bookset emplace:" << endl;

bookset.emplace("新華字典", 2);

std::cout << endl;

​​std::cout<< "output bookset: " << endl;

for_each(bookset.begin(), bookset.end(), (const sbook&book)->void

);std::cout << endl;

執行結果如下

從結果可以看出,books.push_back(sbook("c++從入門到放棄",1)) 這個語句首先執行了建構函式,接著執行拷貝構造複製到vector,最後銷毀臨時物件。

而emplace_back和emplace都只呼叫一次建構函式。兩相對比,效率上的提高不言而喻。

set的分析結果也類似,bookset.insert(sbook("十萬個為什麼",1)) 這個語句執行了兩次構造,一次析構。而 bookset.emplace("新華字典", 2) 語句只執行了一次構造。

通過上面的分析,在開發過程中,如果使用emplace可以達到效果,就應該盡量使用emplace。尤其像push_back,insert這種大量使用的語句,替換使用可以從整體上提高程式的執行效率。

總結相關語法如下

vector

emplace   insert

emplace_back

​ ​push_back

setemplcace   insert

map

emplace   insert

C 11新特性之十一 emplace

emplace操作是c 11新特性,新引入的的三個成員emlace front empace 和 emplace back,這些操作構造而不是拷貝元素到容器中,這些操作分別對應push front insert 和push back,允許我們將元素放在容器頭部 乙個指定的位置和容器尾部。兩者的區別 ...

C 知識高階之 defines使用優化

在介紹 defines使用優化之前,要首先簡單介紹一下編譯原理 比如以c語言為例 1.預處理階段 工作內容 a.巨集替換 b.標頭檔案展開 c.去注釋 d.條件編譯 語言轉換 c語言 c語言 2.編譯階段 工作內容 檢查語法錯誤 語言轉換 c語言 組合語言 3.彙編 語言轉換 組合語言 二進位制 4...

SQL優化之索引使用

最近找工作,遇到乙個面試題 sql哪些關鍵字會忽略索引?因為之前沒這方面的經驗,當時懵逼了,隨便扯了一點。最終有沒能通過面試很遺憾。我們都知道對查詢進行優化,應盡量避免全表掃瞄,多使用索引,首先應考慮在 where 及 order by 涉及的列上建立索引。不過應該注意兩點 1 並不是所有索引對查詢...