C++STL容器篇vector

vector特点:可变大小数组。支持快速随机访问。在尾部之外的位置插入或删除元素可能很慢,使用时需包含头文件vector,打开std 命名空间

vector的迭代器:随机存取迭代器

vetor的存储方式:将元素保存在连续的内存空间中,由于元素是连续存储的,所以可以用元素的下标来计算其地址

vector的增长方式:当有新元素加入时,vector会判断空余空间是否足够容纳新元素的加入,如果不够那么vector会分配新的更大的连续内存空间来保存已有元素的新元素,并释放旧内存。

vector的常用定义方式:

template<classT,class Allocator = allocator<T>>
class vector;
//一般使用只指定第一参数即可,第二参数含默认值
vector<T>myvec1;    
vector<T>myvec2={a1,a2,a3};  //a1,a2,a3 类型的T
vector<int>myvec3(10,1);  //初始化10个int值每个都为1,若不写第二参数创建元素为默认值
vector<T>myvec4(myvec3.begin(),myvec3.end()); //接受两个迭代器
vector<T>myvec5(myvec4)    //这里需注意myvec5和myvec4的模板参数类型T需要相同
myvec1.~vector<T>();  //析构函数

vector的capacity和size: 理解capacity和size的区别非常重要。容器的size是指已经保存的元素的数量,而capacity是指在不分配新的内存空间的前提下它总共可以保存多少元素。

#include<iostream>
#include<vector>
using namespace std;
int main()
{
	vector<int>myvec1(3,1);  //初始化3个元素值为1
	//放入4个元素
	myvec1.push_back(2);
	myvec1.push_back(3);
	myvec1.push_back(4);
	myvec1.push_back(5);
	cout <<"当前容器的size:" <<myvec1.size() << endl;  //7
	cout << "当前容器的capacity:" << myvec1.capacity() << endl;  //9
	return 0;
}

vector的容量之所以很重要有一下两个原因
1:一旦内存重新配置,和vector相关的references、pointers、iterators都会失效。
2:内存重新配置很耗时间。

所以我们可以用reserve()函数来保留适当的容量

    myvec1.reserve(20);
	cout << "当前容器的size:" << myvec1.size() << endl;  //7
	cout << "当前容器的capacity:" << myvec1.capacity() << endl;  //20
常用关于容器容量的函数功能
myvec.size()返回当前的元素数量
myvec.empty()判断大小是否为零
myvec.capacity()返回当前容器容量
myvec.reserve()设置容器容量
vector的赋值操作功能
myvec1=myvec2将myvec2的全部元素赋值给myvec1
myvec1.assign(n,elem)将n个elem赋值给myvec1(会覆盖原有元素)
myvec1.assign(iterator1,iterator2)将迭代器[iterator1,iterator2)指向的内容赋值给myvec1 (会覆盖原有元素)
myvec1.swap(myvec2)将myvec1和myvec2的元素互换(并交换两者的size和capacity)
swap(myvec1,myvec2)全局函数,功能同上,性能不如上版本(因为该版本是泛化)
元素存取操作效果
myvec.at(idx)返回索引idx所表示的元素。如果idx越界则抛出out_of_range
myvec[idx]同上,但越界不抛出异常,会引发未定义行为
myvec.front()返回第一个元素。但不检查该元素是否存在
myvec.back()返回最后一个元素。但不检查该元素是否存在

所以在调用下标索引时,你必须心里有数,确实有效,调用front()和back()时,应调用empty()判断容器是否为空。

vector的迭代器函数效果
myvec.begin()返回一个随机存取迭代器,指向第一个元素
myvec.end()返回一个随机存取迭代器,指向最后一个元素的下一位置
myvec.rbegin()返回一个逆向迭代器,指向逆向迭代的第一个元素
myvec.rend()返回一个逆向迭代器,指向逆向迭代的最后元素的下一位置
vector的安插、移除操作功能
myvec.insert(iterator,elem)在iterator指的位置前插入elem,并返回指向elem的迭代器
myvec.insert(iterator,n,elem)在iterator指的位置前插入n个elem,并返回指向(iterator-n)位置的迭代器
myvec.insert(iterator1,iterator2,iterator3)在iterator1指向的位置前插入[itreator2,iterator3),返回位置(iterator1-n),n为插入的元素个数
myvec.push_back(elem)在尾部添加一个elem副本
myvec.pop_back()移除最后一个元素
myvec.erase(iterator)将iterator指向位置的元素删除并返回指向下一元素的迭代器
myvec.erase(iterator1,iterator2)移除[iterator1,iterator2)范围的所有元素,返回iterator2指向的位置
myvec.resize(num)将元素数量改为num,如果num<size(),移除多出的元素,num>size()调用构造函数添加(添加元素为默认值)
myvec.resize(num,elem)效果同上,默认值改为elem
myvec.clear()移除所有元素,将容器清空

以上为自己阅读书籍和翻阅资料的一些整理和自己的理解,由于自身水平有限,若有错误,欢迎大家指出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值