您的位置:首页 > 其它

emplace_back与push_back的区别

2014-08-14 21:31 281 查看

std::vector::emplace_back

C++

Containers library

std::vector

template< class... Args >
void emplace_back( Args&&... args );
(since C++11)
Appends a new element to the end of the container. The element is constructed in-place, i.e. no copy or move operations are performed. The constructor of the element is called with exactly the same arguments that are supplied to the function.

If the new size() is greater than capacity() then all iterators and references (including the past-the-end iterator) are invalidated. Otherwise only the past-the-end iterator is invalidated.

Parameters

args-arguments to forward to the constructor of the element

Return value

(none)

Complexity

Constant.

Exceptions

If an exception is thrown, this function has no effect (strong exception guarantee). If
T
's move constructor is not noexcept and is not
CopyInsertable
into
*this
, vector will use the throwing move constructor. If it throws, the guarantee is waived and the effects are unspecified.

Notes

The specialization std::vector<bool> did not have
emplace_back()
member until C++14.

Example

The following code uses
emplace_back
to append an object of type
President
to a
std::vector. It demonstrates how
emplace_back
forwards parameters to the
President
constructor and shows how using
emplace_back
avoids the extra copy or move operation required when using
push_back
.

#include <vector>
#include <string>
#include <iostream>

struct President
{
std::string name;
std::string country;
int year;

President(std::string p_name, std::string p_country, int p_year)
: name(std::move(p_name)), country(std::move(p_country)), year(p_year)
{
std::cout << "I am being constructed.\n";
}
President(President&& other)
: name(std::move(other.name)), country(std::move(other.country)), year(other.year)
{
std::cout << "I am being moved.\n";
}
President& operator=(const President& other) = default;
};

int main()
{
std::vector<President> elections;
std::cout << "emplace_back:\n";
elections.emplace_back("Nelson Mandela", "South Africa", 1994);

std::vector<President> reElections;
std::cout << "\npush_back:\n";
reElections.push_back(President("Franklin Delano Roosevelt", "the USA", 1936));

std::cout << "\nContents:\n";
for (President const& president: elections) {
std::cout << president.name << " was elected president of "
<< president.country << " in " << president.year << ".\n";
}
for (President const& president: reElections) {
std::cout << president.name << " was re-elected president of "
<< president.country << " in " << president.year << ".\n";
}
}


Output:

emplace_back:
I am being constructed.

push_back:
I am being constructed.
I am being moved.

Contents:
Nelson Mandela was elected president of South Africa in 1994.
Franklin Delano Roosevelt was re-elected president of the USA in 1936.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: