##实战c++中的vector系列--知道emplace_back为何优于push_back吗?
上一篇博客说道vector中放入struct,我们先构造一个struct对象,再push_back。
那段代码中,之所以不能使用emplace_back,就是因为我们定义的struct没有显示的构造函数。
emplace和解?
放列的意思。
这次我们不把struct当做vector的元素了,我们把一个class当做vector的元素,写下代码:
~~~
#include <iostream>
#include <vector>
#include<string>
using namespace std;
class CText {
private:
string str;
public:
text(string s) :str(s) {
}
void show()const {
cout << str << endl;
}
};
int main()
{
vector<CText > vi;
vi.emplace_back("hey");
vi.front().show();
vi.push_back("girl");//错误
vi.back().show();
return 0;
}
~~~
其中vi.push_back(“girl”);这条语句错误,VS2015报错为:
~~~
error C2664: “void std::vector<text,std::allocator<_Ty>>::push_back(const text &)”: 无法将参数 1 从“const char [5]”转换为“text &&”
~~~
但此时我们稍作修改:
把 vi.push_back(“girl”) 改为
vi.push_back(CText(“girl”));
问题就解决了。。
简而言之,就是empace_back与push_back相比,替我们省去了调用CText进行构造。
**emplace_back**
添加一个新元素到结束的容器。该元件是构成在就地,即没有复制或移动操作进行。
inserts a new element at the end of the vector, right after its current last element. This new element is constructed in place using args as the arguments for its constructor.
This effectively increases the container size by one, which causes an automatic reallocation of the allocated storage space if -and only if- the new vector size surpasses the current vector capacity.
The element is constructed in-place by calling allocator_traits::construct with args forwarded.
A similar member function exists, push_back, which either copies or moves an existing object into the container.
写到这里,你应该明白emplace_back如何是也了吧。
最后再来一段代码,涉及到使用右值引用和std::move的:
~~~
#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";
}
}
//输出:
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.
~~~
- 前言
- 构造、operator=和assign区别
- 将迭代器转换为索引
- copy set to vector(别混淆了reserve和resize)
- 使用vector构造二维数组
- 可怕的迭代器失效(vector重新申请内存)
- 可怕的迭代器失效之二(删除vector中元素)
- vector<unique_ptr<>>初始化(所有权转移)
- vector<unique_ptr<>>作为函数的参数
- vector<unique_ptr<>>赋值给vector<unique_ptr<>>
- creating vector of local structure、vector of structs initialization
- 知道emplace_back为何优于push_back吗?
- emplace_back造成的引用失效
- vector的一些异常
- vector的遍历(stl算法、vector迭代器(不要在循环中判断不等于end())、operator[])
- 使用sort算法对vector进行排序(对vector<string>排序、使用稳定的排序std::stable_sort())
- vector应用之STL的find、find_if、find_end、find_first_of、find_if_not(C++11)
- 使用sort算法对vector<unique_ptr<string>>进行排序(sort函数“应输入 2 个参数,却提供了 3 个)
- 对vector<自定义类>使用std::find 和 std::find_if 算法