2013-05-21 33 views
15

Tôi đã cố gắng tìm một số cách dễ dàng để phát ra các phần tử trong một std::vector<std::shared_ptr<int>> nhưng không thể đi kèm với bất cứ điều gì. std::shared_ptr mất con trỏ như tham số, vì vậy tôi vẫn có thể viết này:make_shared và chức năng emplace

std::vector<std::shared_ptr<int>> vec; 
vec.emplace_back(new int(10)); 

Tuy nhiên, tôi không muốn sử dụng new bằng tay nếu có thể, và thay vì muốn sử dụng std::make_shared nếu có thể. Vấn đề là nếu tôi thực sự muốn sử dụng nó, tôi phải sử dụng push_back thay vào đó và mất lợi thế của việc xây dựng tại chỗ:

std::vector<std::shared_ptr<int>> vec; 
vec.push_back(std::make_shared<int>(10)); 

Có cách nào để có được những ưu điểm của cả hai emplace_backstd::make_shared? Nếu không, có một hướng dẫn tôi nên làm theo trong trường hợp như vậy?

EDIT: Thực ra, tôi đã đặt câu hỏi này nhưng gặp sự cố không liên quan. Câu trả lời của Andy là tốt nhất và không có bất kỳ vấn đề thực tế với việc sử dụng cả hai chức năng emplacestd::make_shared cùng một lúc.

Trả lời

14

Bạn có thể để xây dựng di chuyển tại chỗ xảy ra:

vec.emplace_back(std::make_shared<int>(42)); 
+0

Tôi nghĩ đó là tốt như nó đang diễn ra để có được –

+0

Không anh chỉ nói anh không thể làm điều đó? – 0x499602D2

+0

@ 0x499602D2: Tại sao không? –