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() 移除所有元素,将容器清空

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

原创文章 23 获赞 1 访问量 374

猜你喜欢

转载自blog.csdn.net/weixin_44806268/article/details/105310819