vector的性能利器reserve
转载请注明文章出处:https://tlanyan.me/reserve-of... vector是C++编程时的常用容器,其帮助用户自动管理存储空间,简单易用,且能避免资源泄露的问题。需要动态分配存储空间的场景,完全可替代原生数组。 vector被人诟病的地方在于性能。C++ 11引入array容器,有原生数组的性能,编译期能确定大小的情况可取代vector。但对于运行期才能确定大小的情况,array不适用,还是得上vector。 实践中提高vector性能的要点是尽量使用reserve(仅次于换编译器和STL实现)。运行期依然不能确定数组的个数,明智的选择是什么也不做,push_back/emplace_back就足够;运行期能确定个数,则应该用reserve,不建议用传递大小的数组构造函数或者调用resize。 reserve vs resizereserve和resize函数都能分配足够容纳下指定个数对象的空间。不同之处是resize(或构造函数传递数组个数)会改变数组的size(即当前元素的指针),并且极大的可能性会调用存储对象的(复制)构造函数。reserve做的事情就比较纯粹:仅分配所需的空间。 一段代码说明三者的区别: // file: test.cpp#include <iostream>#include <vector>class Foo { public: Foo() { std::cout << "Foo constructor" << std::endl; }};int main(int argc, char* argv[]) { std::cout << "initialize vector with element number..." << std::endl; std::vector<Foo> vec1(5); std::cout << "-------------" << std::endl; std::cout << "vec1 size:" << vec1.size() << std::endl << std::endl; std::cout << "vector resize..." << std::endl; std::vector<Foo> vec2; vec2.resize(5); std::cout << "-------------" << std::endl; std::cout << "vec2 size:" << vec2.size() << std::endl << std::endl; std::cout << "vector reserve..." << std::endl; std::vector<Foo> vec3; vec3.reserve(5); std::cout << "-------------" << std::endl; std::cout << "vec3 size:" << vec3.size() << std::endl << std::endl; return 0;}用gcc编译程序:g++ -std=c++0x -o test -O2 test.cpp,然后./test执行程序,结果如下: ...