c++ vector

初始化

(1)默认初始化,vector为空, size为0,表明容器中没有元素,而且 capacity 也返回 0,意味着还没有分配内存空间。这种初始化方式适用于元素个数未知,需要在程序中动态添加的情况。

cpp 复制代码
vector<int> list1; 

(2)两种方式等价 ,list2 初始化为list 的拷贝,list必须与list2 类型相同,也就是同为int的vector类型,list2将具有和list相同的容量和元素

cpp 复制代码
vector<int> list2(list);
vector<int> list2 = list; 

(3)ilist 初始化为列表中元素的拷贝,列表中元素必须与ilist的元素类型相容,本例中必须是与整数类型相容的类型,整形会直接拷贝,其他类型会进行类型转换。

cpp 复制代码
vector<int> ilist = {1,2,3.0,4,5,6,7};
vector<int> ilist {1,2,3.0,4,5,6,7};

(4)ilist3初始化为两个迭代器指定范围中元素的拷贝,范围中的元素类型必须与ilist3 的元素类型相容

cpp 复制代码
vector<int> ilist3(ilist.begin()+2,ilist.end()-1);

(5)默认值初始化,ilist4中将包含7个元素,每个元素进行缺省的值初始化,对于int,也就是被赋值为0,因此ilist4被初始化为包含7个0。当程序运行初期元素大致数量可预知,而元素的值需要动态获取的时候,可采用这种初始化方式。

cpp 复制代码
 vector<int> ilist4(7);

(6)指定值初始化,ilist5被初始化为包含7个值为3的int

cpp 复制代码
vector<int> ilist5(7,3);

capacity

查询容器预留了多大空间(在不进行重新分配内存的前提下,最多可以容纳多少个元素)

reserve和resize区别

  • resize(n)
    调整容器的长度大小,使其能容纳n个元素。如果n小于容器的当前的size,则删除多出来的元素。否则,添加采用值初始化的元素。
  • resize(n,t)
    将所有新添加的元素初始化为t
  • reserve(n)
    预分配n个元素的存储空间
  1. reserve: 分配空间,重设当前容器的预留大小,更改capacity但不改变size;resize: 分配空间,更改capacity也改变size
  2. 知道vector的大小,resize后可以当数组来用,不会分配多余的内存。
  3. reserve是容器预留空间,但并不真正创建元素对象,在创建对象之前,不能引用容器内的元素,因此当加入新的元素时,需要用push_back()/insert()函数;resize是改变容器的大小,并且创建对象,因此,调用这个函数之后,就可以引用容器内的对象了,因此当加入新的元素时,用operator[]操作符,或者用迭代器来引用元素对象。
  4. 函数形式有区别,reserve函数之后一个参数,即需要预留的容器的空间;resize函数可以有两个参数,第一个参数是容器新的大小,第二个参数是要加入容器中的新元素,如果这个参数被省略,那么就调用元素对象的默认构造函数。
  5. resize影响元素的个数;reserve只分配预留的空间,capacity() >= size()

vector是在内存中是连续分布的,所以设计上总会在所有已经有元素外预留一些空间,否则每次追加新元素时都要再次分配内存,那准备就绪将很低,假如当vector中可能会存在约500个元素时, 比较两种做法:

cpp 复制代码
方法1
vector<int> myVec, 然后500次调用 myVec.push_back(****)
方法2
vector<int> myVec(500), 然后500次调用 myVec.push_back(****)

方法2只需要进行1到2次内存分配,而方法1不知道要进行多少次内存分配了

cpp 复制代码
错误, 因为a还没有下标为10这个元素,现在size() ==10, capacity() ==20; 要追加下标10这个元素只能给下标10赋值;
vector<int> a(10);  a.reserve(20); a[10] = 999;

vector<int> sample(10);  //size() == 10; capacity() == 10;

sample.push_back(999); //size() == 11; capacity () == 15; //自动扩容, capacity这个超余量是不一定的,也不一定是15.

假设当前size()为50, capacity()为100
vector<int> sample; 

resize(10) 10到49下标的元素被删除. capacity()==100,不变,没有进行内存重新分配

resize(60).  //size() == 60; 50到59下标用默认构造函数填充. capacity()== 100,不变,没有进行内存重新分配.

resize(60, 9999).  //size() ==  60; 50到59下标用9999填充. capacity() == 100,不变,没有进行内存重新分配.

resize(200). //size() == 200; 50到199下载用默认构造函数填充. capacity() == 200, 自动扩容,重新分配内存.

reserve(10). //size() == 50; 不变,没有元素被删除, capacity() == 100, 不变. 即reserve调用没起作用.

reserve(60). //size() == 50; 元素没有变, capacity() == 100, 不变. 即reserve调用没起作用.

reserve(200). //size() == 50; 元素没有变, capacity() == 200, 扩容,重新分配内存.
相关推荐
青莳吖7 分钟前
Java通过Map实现与SQL中的group by相同的逻辑
java·开发语言·sql
Buleall14 分钟前
期末考学C
java·开发语言
重生之绝世牛码16 分钟前
Java设计模式 —— 【结构型模式】外观模式详解
java·大数据·开发语言·设计模式·设计原则·外观模式
小蜗牛慢慢爬行22 分钟前
有关异步场景的 10 大 Spring Boot 面试问题
java·开发语言·网络·spring boot·后端·spring·面试
Algorithm157632 分钟前
云原生相关的 Go 语言工程师技术路线(含博客网址导航)
开发语言·云原生·golang
shinelord明41 分钟前
【再谈设计模式】享元模式~对象共享的优化妙手
开发语言·数据结构·算法·设计模式·软件工程
Monly211 小时前
Java(若依):修改Tomcat的版本
java·开发语言·tomcat
boligongzhu1 小时前
DALSA工业相机SDK二次开发(图像采集及保存)C#版
开发语言·c#·dalsa
Eric.Lee20211 小时前
moviepy将图片序列制作成视频并加载字幕 - python 实现
开发语言·python·音视频·moviepy·字幕视频合成·图像制作为视频
小俊俊的博客1 小时前
海康RGBD相机使用C++和Opencv采集图像记录
c++·opencv·海康·rgbd相机