vector: resize reserve
问题:使用vector时,直接push_back会造成很多复制(push_back时不一定就增加一个位置,要是加多了,后面的push_back倒是不会引起大量复制)#include<vector>#include<iostream>class A{int a;public:A() { std::cout << "构造函数1"<<std::endl;
·
问题:使用vector时,直接push_back会造成很多复制(push_back时不一定就增加一个位置,要是加多了,后面的push_back倒是不会引起大量复制,例如在push_back第十个元素后,size=10,capacity=13)
#include<vector>
#include<iostream>
class A
{
int a;
public:
A() { std::cout << "构造函数1"<<std::endl; }
A(int a1):a(a1){ std::cout << "构造函数2" << std::endl; }
A(const A& s)
{
a = s.a;
std::cout << "复制构造函数" << std::endl;
}
~A(){ std::cout << "析构函数" << std::endl; }
};
int main()
{
std::vector<A> s;
s.push_back(1);
s.push_back(2);
s.push_back(3);
system("pause");
return 0;
}
1、创建的时候指定容量
std::vector<A> s(3);
s.push_back(1);
s.push_back(2);
s.push_back(3);
效率太差了,复制了好多
2、reserve指定容量
std::vector<A> s;
s.reserve(2);
for(int i=0;i<3;i++)
s.push_back(1);
std::cout << s.size();
可见reserve时并没有创建任何对象,但空间申请了(size不计算这些空间只计算元素个数,capacity会计算这些容量),因为只有在i=3时才自动扩充空间(自动扩充时好像是reserve三空间)
3、resize指定容量
std::vector<A> s;
s.resize(3);
会调用构造函数创建对象,但在已经有元素时,resize可以保留它们。
std::vector<A> s;
s.push_back(1);
s.push_back(2);
s.push_back(3);
s.resize(6);
reserve也能保留前面的元素,而且新开辟的空间(size不计算,capacity计算),也没创建对象。
std::vector<A> s;
s.push_back(1);
s.push_back(2);
s.push_back(3);
s.reserve(6);
std::cout << s.size();//输出3
s.push_back(4);
s.push_back(5);
s.push_back(6);
std::cout << s.size();//输出6
总结:我认为reserve优点还是很大的。
4、使用数组初始化
std::vector<A> s({1,2,3,4,5});
输出为
可见效率还是很高的;
更多推荐
已为社区贡献1条内容
所有评论(0)