vector
/*
-
vector的基本使用
-
如何优化
-
使用emplace_back() 代替 push_back()
emplace_back 用于在容器末尾直接构造一个新的对象,而不是先构造一个对象然后将其复制或移动到容器中。它接受构造对象所需的参数,并在容器末尾直接构造该对象。这种方法避免了不必要的拷贝或移动操作,通常在性能上更为高效。
push_back 用于将一个已有的对象添加到容器的末尾。它接受一个对象(或者对象的副本),并将这个对象的副本存储在容器中, 具体来说,它会调用对象的拷贝构造函数或移动构造函数来创建容器中存储的对象。
- 若知道容器中可能存在具体的数据个数,调用reserve初始化容器大小
*/
cpp
/*
1. vector的基本使用
2. 如何优化
1. 使用emplace_back() 代替 push_back()
emplace_back 用于在容器末尾直接构造一个新的对象,而不是先构造一个对象然后将其复制或移动到容器中。
它接受构造对象所需的参数,并在容器末尾直接构造该对象。这种方法避免了不必要的拷贝或移动操作,通常在性能上更为高效。
push_back 用于将一个已有的对象添加到容器的末尾。它接受一个对象(或者对象的副本),并将这个对象的副本存储在容器中。
具体来说,它会调用对象的拷贝构造函数或移动构造函数来创建容器中存储的对象。
2. 若知道容器中可能存在具体的数据个数,调用reserve初始化容器大小
*/
#include<iostream>
using namespace std;
#include<vector>
class Entry
{
private:
int a,b,c;
public:
Entry(int a, int b, int c) : a(a),b(b),c(c)
{
cout<<"copied!"<<endl;
}
Entry(const Entry & other) : a(other.a),b(other.b),c(other.c)
{
cout<<"copy copied!"<<endl;
}
friend ostream& operator<<(ostream& stream, Entry& entry);
};
ostream& operator<<(ostream& stream, Entry& entry)
{
stream<<entry.a<<" "<<entry.b<<" "<<entry.c;
return stream;
}
int main()
{
//Entry e1(1,2,3);
vector<Entry> entries;
// copy 9 times -> copy 6 times
entries.reserve(3);
// entries.push_back({3,2,4});
// entries.push_back({6,8,7});
// entries.push_back({6,8,7});
// copy 6 times -> copy 3 times
entries.emplace_back(3,2,4);
entries.emplace_back(6,8,7);
entries.emplace_back(1,2,9);
for(Entry & it : entries)
{
cout<< it <<endl;
}
// entries.erase(entries.begin()+1);
// for(auto & it : entries)
// {
// cout<<it<<endl;
// }
return 0;
}
未预分配存储空间 并使用push_back插入元素
调用了三次有参构造函数和六次拷贝构造函数
使用预分配存储空间并使用push_back插入元素
调用了三次有参构造函数和三次拷贝构造函数
使用预分配存储空间并使用emplace_back插入元素
调用了三次有参构造函数