一、vector储存元素的方式:
vecto内的元素是连续储存的,当往vector中添加元素时,如果容器中已经没有空间容纳新的元素,由于元素必须连续存储以便索引访
问,所以不能在内存中随便找个地方存储这个新元素。于是,vector 必须重新分配存储空间,用来存放原来的元素以及新添加的元素:
存放在旧存储空间中的元素被复制到新存储空间里,接着插入新元素,最后撤销旧的存储空间。
对于不连续存储元素的容器,不存在这样的内存分配问题。例如,在 list 容器中添加一个元素,标准库只需创建一个新元素,然后将
该新元素连接在已存在的链表中,不需要重新分配存储空间,也不必复制任何已存在的元素。
对于大部分应用,使用 vector 容器是最好的。原因在于,标准库的实现者使用这样内存分配策略:以最小的代价连续存储元素。由此
而带来的访问元素的便利弥补了其存储代价。vector 容器预留了这些额外的存储区,用于存放新添加的元素。于是,不必为每个新元
素重新分配容器。
二、vector的size与capacity的区别,以及reserve操作:
void test_vector_capacity_1() { std::vector<int> vec; std::cout << "size:" << vec.size() << std::endl; //size:0 std::cout << "capacity:" << vec.capacity() << std::endl; //capacity:0 // 空vector的size和capacity大小都默认为0 vec.push_back(100); std::cout << "size:" << vec.size() << std::endl; //size:1 std::cout << "capacity:" << vec.capacity() << std::endl; //capacity:1 vec.push_back(101); std::cout << "size:" << vec.size() << std::endl; //size:2 std::cout << "capacity:" << vec.capacity() << std::endl; //capacity:2 } void test_vector_capacity_2() { std::vector<int> vec; for( int i = 0; i != 24; ++i ) { vec.push_back(i); } std::cout << "size:" << vec.size() << std::endl; //size:24 std::cout << "capacity:" << vec.capacity() << std::endl; //capacity:28 // 预留50个元素的存储空间,即capacity至少为50 vec.reserve(50); std::cout << "size:" << vec.size() << std::endl; //size:24 std::cout << "capacity:" << vec.capacity() << std::endl; //capacity:50 // 将预留的容量用完: while( vec.size() != vec.capacity() ) { vec.push_back(10); } std::cout << "size:" << vec.size() << std::endl; //size:50 std::cout << "capacity:" << vec.capacity() << std::endl; //capacity:50 /* 使用reserve预留了50容量,因此 vector在每次添加元素时不必做任何的内存分配工作。事实上,只要有剩余的容量,vector 就不必为其元素重新分配存储空间。当把预留容量使用完后,如果要添加新的元素,vector 必须为自己重新分配存储空间 */ vec.push_back(11); std::cout << "size:" << vec.size() << std::endl; //size:51 std::cout << "capacity:" << vec.capacity() << std::endl; //capacity:75,重新分配储存空间 vec.reserve(70); std::cout << "size:" << vec.size() << std::endl; //size:51 std::cout << "capacity:" << vec.capacity() << std::endl; //capacity:75 /* 调节容量为70但小于上一次分配的容量75,此时容量并不会改变,容器的元素个数也不会改变 */ vec.reserve(40); std::cout << "size:" << vec.size() << std::endl; //size:51 std::cout << "capacity:" << vec.capacity() << std::endl; //capacity:75 // 需要调节的容量为100,大于75,则此时的容量为100 vec.reserve(100); std::cout << "size:" << vec.size() << std::endl; //size:51 std::cout << "capacity:" << vec.capacity() << std::endl; //capacity:100 }
三、vector容器的储存空间分配策略:
创建空的vector对象时容量为0,当现有容量用完后,重新分配空间时容量的增幅为原容量的1/2(整除2的结果),如果增幅小于1,则
取1,reserve操作将容量设定为指定大小。