问题:使用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});输出为 可见效率还是很高的;