STL中的capacity和size

STL中的vector,list,queue等,甚至string都支持长度或size的动态增加,这在存储事先size不知道的,或者size动态变化的多对象组合(类似于数组)来说是很方便的。事实上,为了支持size的动态变化,STL中的vector,list以及string会申请比size大的空间,即capacity,用于之后添加新的元素。这样做就可以在添加新元素时,直接存放在之前已经预先申请的空间上,免去了从新申请一块内存,再copy到新内存的开销。

vector,list,queue,以及string都有size和capacity的成员函数,根据我的一些测试,发现有一下规律(可能这些规律与具体的STL实现有关系):

1、在初始化的时候,一般size和capacity是相等的,也就是说allocator没有额外申请内存。

如string s("hello world!"); s.size()和s.capacity()都等于12。

2、在由于某种运算(append,insert,+)使得size变大时,会出现一下几种情况:

(1)capacity能够存下新增的元素,size将变大,capacity将不变;

(2)2倍capacity能够存下原来和新增的元素,它就会申请2*capacity的空间,copy原来和新增的元素,size变大,capacity变为原来两倍。

如s += “string”;那么s.size()变为18,而s.capacity()变为24。

(3)2倍capacity存不下原来和新增的元素,OK,申请原来size+新增size的空间,此时size和capacity相等。

如s += ”hello world!hello world!“;那么s.size()和s.capasity()都等于36。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
vector是C++标准库的一个动态数组容器,提供了一种方便的方式来存储和操作一系列的元素。vector可以自动调整大小,可以在尾部快速插入和删除元素,并且支持随机访问。 以下是vector的一些重要特点和用法: 1. 定义和初始化vector: 可以使用以下方式定义和初始化一个vector: ```cpp std::vector<int> vec; // 定义一个空的vector std::vector<int> vec1(5); // 定义一个包含5个默认初始化元素的vector std::vector<int> vec2(5, 10); // 定义一个包含5个值为10的元素的vector std::vector<int> vec3 = {1, 2, 3, 4, 5}; // 使用初始化列表初始化vector ``` 2. 访问和修改元素: 可以使用下标运算符[]或at()函数来访问和修改vector的元素。例如: ```cpp std::vector<int> vec = {1, 2, 3, 4, 5}; int firstElement = vec; // 访问第一个元素 int secondElement = vec.at(1); // 访问第二个元素 vec = 10; // 修改第三个元素的值为10 ``` 3. 插入和删除元素: 可以使用push_back()函数在vector的尾部插入一个元素,使用pop_back()函数删除尾部的元素。也可以使用insert()函数在指定位置插入元素,使用erase()函数删除指定位置的元素。例如: ```cpp std::vector<int> vec = {1, 2, 3}; vec.push_back(4); // 在尾部插入元素4 vec.pop_back(); // 删除尾部的元素 vec.insert(vec.begin() + 1, 10); // 在第二个位置插入元素10 vec.erase(vec.begin() + 2); // 删除第三个位置的元素 ``` 4. 获取vector的大小和容量: 可以使用size()函数获取vector元素的个数,使用capacity()函数获取vector的容量(即当前分配的内存空间大小)。例如: ```cpp std::vector<int> vec = {1, 2, 3, 4, 5}; int size = vec.size(); // 获取元素个数,结果为5 int capacity = vec.capacity(); // 获取容量,结果可能大于等于5 ``` 5. 遍历vector: 可以使用迭代器或范围for循环来遍历vector的元素。例如: ```cpp std::vector<int> vec = {1, 2, 3, 4, 5}; for (auto it = vec.begin(); it != vec.end(); ++it) { std::cout << *it << " "; } // 或者使用范围for循环 for (int num : vec) { std::cout << num << " "; } ``` 这些只是vector的一些基本用法,还有很多其他的函数和特性可以探索和使用。你可以参考C++标准库的文档或其他相关资料来深入了解vector的更多用法和细节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值