emplace_back — constructs element in-place. push_back — copies/moves existing element.
1#include <vector>23class Expensive {4 std::string data;5public:6 Expensive(const std::string& s) : data(s) {7 std::cout << "Constructed\n";8 }9 Expensive(const Expensive& other) : data(other.data) {10 std::cout << "Copied\n";11 }12 Expensive(Expensive&& other) noexcept : data(std::move(other.data)) {13 std::cout << "Moved\n";14 }15};1617std::vector<Expensive> vec;1819vec.push_back(Expensive("hello")); // Construct + Move20vec.emplace_back("hello"); // Construct only2122// emplace_back with complex arguments23vec.emplace_back(std::string(10, 'a')); // Constructs in-place
When to use: