问题:使用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});

输出为
在这里插入图片描述
可见效率还是很高的;

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐