admin管理员组文章数量:1611907
1. vector的对象的存储方式
为了支持随机访问,vector将元素连续存储–每个元素紧挨着前一个元素存储。容器中元素是连续存储的,且容器的大小是可变的。
在容器中增加元素时。vector根据存储元素的大小,在内存上申请一个空间,用于存储数据,空间的大小通常会大于所存储元素的实际大小,并且预留出一部分预留的空间,以便再次增加数据时,可以不用重新开辟空间。
当容器再次增加新的元素后,首先判断预留的空间是否够用,如果够用直接在预留空间中存储。如果预留的空间不够,需要在内存中开辟一整块新的更大的空间,并将vector原来的存储的数据拷贝过来,存储到新的内存中,然后在新的内存中增加需要增加的元素,这样保证存储的空间是连续的。所开的空间会预留出一部分空间,以便后续增加数据。
理解了vector的对象的存储方式,很轻松理解size、capacity、reserve、resize的使用。
2. size()和capacity()
size(): 返回vector中存放元素的实际数量( 实际存储元素的个数)。返回值为size_type(无符号整数类型)
capacity(): 返回vector在内存中,开辟空间的容量(最多能放所少个元素)。返回值为size_type(无符号整数类型)
例子:
#include <iostream>
#include <vector>
int main()
{
std::vector<int> vecInt;
std::cout << vecInt.size() << std::endl; // 输出的结果为0
std::cout << vecInt.capacity() << std::endl; // 输出的结果为0
for(int i = 0; i < 10 ; ++i)
{
vecInt.push_back(i);
}
std::cout << vecInt.size() << std::endl; // 输出的结果为10,容器中存了10个元素
std::cout << vecInt.capacity() << std::endl; // 输出的结果为16,容器在内存开辟空间的容量(包含预留空间)
}
3. reserve()和resize()
reserve(): 在内存上指定容器开辟空间的容量大小。
- 如果容器目前在内存上开辟空间的容量大于指定的容量,则不做处理直接返回。
- 如果容器目前在内存上开辟空间的容量小于指定的容量,则在内存上开辟指定容量大小的空间,并将原来的数据拷贝到新的内存中。(相当于容器扩容)
resize():设置容器中的元素。有两个参数,一个参数表示指定元素的数量。另一个可选参数表示,指定元素初始化的值。如果不传入第二个参数,则使用默认值初始化。
- 如果容器中的元素数量大于resize中设置的值,则将后面多出的元素删除。
- 如果容器中的元素数量小于resize中设置的值,则在原来的元素后面新增新的元素,如果没有指定值,则按照默认值初始化。
例子:
#include <iostream>
#include <vector>
int main()
{
std::vector<int> vecInt;
std::cout << vecInt.size() << std::endl; // 输出的结果为0
std::cout << vecInt.capacity() << std::endl; // 输出的结果为0
vecInt.reserve(10); // 在内存上开辟容量为10的空间
std::cout << vecInt.size() << std::endl; // 输出的结果为0
std::cout << vecInt.capacity() << std::endl; // 输出的结果为10
vecInt.resize(20,1); // 将容器初始化20个元素,每个元素的默认值为1
std::cout << vecInt.size() << std::endl; // 输出的结果为20,容器中存了20个元素
std::cout << vecInt.capacity() << std::endl; // 输出的结果为20,容器在内存开辟空间的容量
}
注意: 在执行resize时,如果容器中在内存中,所开的空间不够,会自动扩容。不一定非要执行reserve(),提前开辟空间。在容器中使用其他函数添加元素也是如此。
版权声明:本文标题:C++ std::vector: vector中元素的存储方式 size、capacity、reserve、resize的使用 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dianzi/1728620243a1166262.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论