stl vector

vector表现出来的是一个大小可变、内存连续的数组。
类模板定义:

template <typename T, typename Allocator = allocator<T> >
class vector;

vector支持下列操作:

操作作用
vector c默认构造函数,构造一个没有任何元素的空vector
vector c(c2)复制构造函数
vector c(rv)移动构造函数
vector c(n)构造一个大小为n的vector,对元素进行值初始化
vector c(n, elem)构造一个大小为n的vector,用elem对元素进行初始化
vector c(beg, end)构造一个vector,以区间[beg, end)对元素进行初始化
vector c(initlist)构造一个vector,用初值列对元素进行初始化
c.empty()判断容器是否为空
c.size()获取元素个数
c.max_size()元素个数最大可能值
c.capacity()容器大小
c.reserve(num)为容器保留num个元素的内存
==、!=、<、>、<=、>=比较元素
c = c2赋值
c = rv移动语义赋值
c = initlist用初值列赋值
c.assign(n, elem)将n个elem赋值给c
a.assign(beg, end)将区间[beg,end)的元素对c赋值
c1.swap(c2)交换c1、c2数据
swap(c1,c2)交换c1、c2数据
c[idx]随机访问,不检查范围
c.at(idx)随机访问,超出范围抛出 out_of_range 异常
c.front()返回第一个元素,不检查元素是否存在
c.back()返回最后一个元素,不检查元素是否存在
c.begin()指向第一个元素的随机读写迭代器
c.end()指向最后元素下一位置的随机读写迭代器
c.cbegin()指向第一个元素的随机只读迭代器
c.cend()指向最后元素下一位置的随机只读迭代器
c.rbegin()指向最后元素的反向随机读写迭代器
c.rend()指向第一个元素前一位置的反向随机读写迭代器
c.crbegin()指向最后元素的反向随机只读迭代器
c.crend()指向第一个元素前一位置的反向随机只读迭代器
c.push_back(elem)把elem追加到末尾
c.pop_back()移除最后一个元素,不返回
c.insert(pos, elem)在pos位置前插入元素elem,返回指向新元素的迭代器
c.insert(pos, n, elem)在pos位置前插入n个元素elem,返回指向第一个新元素的迭代器
c.insert(pos, beg, end)在pos位置前插入区间[beg,end)内的元素,返回指向第一个新元素的迭代器
c.insert(pos, initlist)在pos位置前插入初值列中元素,返回指向第一个新元素的迭代器
c.emplace(pos, args…)在pos位置前插入一个以args为初值的元素,返回指向新元素位置的迭代器
c.emplace_back(args…)追加一个以args为初值的元素
c.erase(pos)删除pos位置上元素,返回下一个元素的位置
c.erase(beg, end)删除[beg, end)区间内所有元素,返回下一个元素位置
c.resize(num)将元素数量改为num,对新增元素进行默认值初始化
c.resize(num, elem)将元素数量改为num,用elem对新增元素进行初始化
c.clear()删除所有元素

1、和array不用,vector的默认构造函数只会构造一个空的vector。而构造函数vector<> c(n)会构造一个具有n个元素的vector,并对每一个元素进行值初始化。对于默认构造函数比较耗时的类型,可以考虑先用reserve()分配足够内存,在需要时再进行元素初始化。

2、如果reserve()申请的空间比当前还小,那么函数不会起作用,也就是reserve()不能减小容器的容量。但是swap()函数在交换数据的同时会交换两个容器的容量。

实际上,vector内部也是用一段连续的内存来存储元素,swap()函数只是交换了两块内存的指针,所以同时也交换了容器的容量:

vector<int> a1 = { 1, 2, 3 };
vector<int> a2 = { 3, 2, 1, 0 };
auto b = a1.begin();
auto e = a1.end();

cout << "before swap: " << endl;
cout << "a1 ptr: " << a1.data() << endl;
cout << "a2 ptr: " << a2.data() << endl;
cout << "a1 size: " << a1.size() << endl;
cout << "a2 size: " << a2.size() << endl;

a1.swap(a2);

cout << "after swap: " << endl;
cout << "a1 ptr: " << a1.data() << endl;
cout << "a2 ptr: " << a2.data() << endl;
cout << "a1 size: " << a1.size() << endl;
cout << "a2 size: " << a2.size() << endl;

while (b != e)
{
	cout << *b << endl;
	b++;
}

另外,swap()函数不会令迭代器失效,只是访问的容器改变了。我的理解是,迭代器和容器没有绑定关系,而是和元素对象绑定。只有迭代器指向的元素对象改变了,迭代器才会失效。

vector<int> a;
a.reserve(5);
a.push_back(0);
a.push_back(1);
a.push_back(3);
a.push_back(4);

auto iter = a.begin() + 2;

cout << "addr1: " << iter._Ptr << endl;
cout << "addr2: " << a.insert(iter, 2)._Ptr << endl;
cout << "addr3: " << iter._Ptr << endl;
cout << *iter << endl;				// error

在这里插入图片描述
代码中输出addr1、addr2 和 addr3 是同一个内存地址。但是,insert操作后,迭代器iter指向对象改变了所以失效了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值