说明
C++的Vector容器是STL中顺序容器类型的一种,它支持快速随机访问。本质上它是一个顺序存储的类模板。 要使用时必须包含对应的头文件。
Vector优点:
1、内存连续,导致增加、查询元素效率较快。
2、随着元素的增减,Vector自动动态增减内存大小。
Vector缺点:
1、内存连续,导致插入、删除元素效率较慢。
使用接口
/* 定义int类型的vector容器 */
std::vector<int> testVector;
/*
返回指向向量容器的第一个元素的迭代器。
_NODISCARD iterator begin() noexcept
返回指向向量容器的最后一个元素的迭代器。
_NODISCARD iterator end() noexcept
*/
std::vector<int>::iterator it_begin = testVector.begin();
std::vector<int>::iterator it_end = testVector.end();
/*
返回一个指向向量第一个元素的常量迭代器,不可修改内容。
_NODISCARD const_iterator cbegin() const noexcept
返回一个指向向量最后元素后一个的常量迭代器,不可修改内容。
_NODISCARD const_iterator cend() const noexcept
*/
std::vector<int>::const_iterator it = testVector.cbegin(); // 得到首个位置常量元素
std::vector<int>::const_iterator it = testVector.cend()-1; // 得到尾部位置常量元素
/*
返回容器当前能够容纳的元素数量。
_NODISCARD size_type capacity() const noexcept
注意:
容器的大小一旦超过capacity的大小,vector会重新配置内部的存储器,重新配置会很耗时间。
导致和vector元素相关的所有reference、pointers、iterator都会失效,切记重新获取指针可以避免指针失效。
如何避免内存重新配置:
1、Reserve()保留适当容量
testVector.reverse(80);
2、利用构造函数创建出足够空间
std::vector<int> testVector(80);
*/
int size = testVector.capacity();
/*
返回一个指向向量最后一个元素(即反向开始)的反向迭代器。
_NODISCARD reverse_iterator rbegin() noexcept
返回一个指向向量第一个迭代器之前的迭代器。
_NODISCARD reverse_iterator rend() noexcept
*/
std::vector<int>::reverse_iterator it = testVector.rbegin();
std::vector<int>::reverse_iterator itx = testVector.rend(); // 注意:异常,因为第一个元素前没有元素了。
std::vector<int>::reverse_iterator it = testVector.rend()-1; // 正确的指向第一个元素。
/*
返回一个指向向量最后一个元素(即反向开始)的反向常量迭代器。不可修改内容。
_NODISCARD reverse_iterator rbegin() noexcept
返回一个指向向量第一个元素之前的常量迭代器。不可修改内容。
_NODISCARD reverse_iterator rend() noexcept
*/
std::vector<int>::const_reverse_iterator it = testVector.crbegin();
std::vector<int>::const_reverse_iterator it = testVector.crend() - 1;
/*
返回内置vecotr所指的数组内存的第一个元素的指针。
_NODISCARD _Ty * data() noexcept
*/
int *ptr = testVector.data();
ptr[0] = 10; // 注意不要越界,界限是vector的现有数据长度。
/*
向量大小为 0 则返回true,否则返回false。
_NODISCARD bool empty() const noexcept
*/
bool flag = testVector.empty();
/*
删除指定位置迭代器,并返回删除元素的下一个元素的迭代器
iterator erase(const_iterator _Where)
*/
std::vector<int>::iterator iter = testVector.erase(testVector.begin()); // 删除第1个元素
std::vector<int>::iterator iter = testVector.erase(testVector.end()); // 注意:若删除的元素没有下一个元素则会发生异常。
std::vector<int>::iterator aaa = testVector.erase(testVector.begin(), testVector.begin() + 2); // 删除第1个元素到第2个元素
std::vector<int>::iterator iter = testVector.erase(testVector.begin(), testVector.begin() + 20); // 注意:删除不能超过容器的长度否则发生异常。
/*
删除vector容器中所有的元素,使其变成空的vector容器。
如果vector存储的是指向对象的指针,此函数并不会调用到对应的析构函数。会造成内存泄漏。想要删除vector中的元素则应遍历vector使用delete,然后再clear
void clear() noexcept
*/
testVector.clear();
/*
返回容器首个元素。(注意:当容器为空时调用该函数会异常。)
_NODISCARD _Ty& front()
返回容器末尾元素。(注意:当容器为空时调用该函数会异常。)
_NODISCARD _Ty& back()
*/
int value = testVector.front();
int value = testVector.back();
/*
既分配了空间,也创建了对象。
void resize(_CRT_GUARDOVERFLOW const size_type _Newsize)
下面两行代码表明testVectorh的size为3,前两个元素为0,最后的元素为20。
*/
testVector.resize(2);
testVector.push_back(20);
/*
预留至少共容纳size个元素的空间。
void reserve(_CRT_GUARDOVERFLOW const size_type _Newcapacity)
*/
testVector.reserve(2); // 表明预留两个大小,但目前代码实际size为0。
/*
将区间[first,last)的元素赋值到当前的vector容器中,或者赋n个值为x的元素到vector容器中。
这个函数会清除掉vector容器中以前的内容。
void assign(_Iter _First, _Iter _Last)
*/
testVector.assign(2,4);
/*
将同类型容器深拷贝过来。
这个函数会清除掉vector容器中以前的内容。
vector& operator=(vector&& _Right)
*/
testVector = std::vector<int>{2,2,3};
/*
在末端插入数据
void push_back(const _Ty& _Val)
*/
testVector.push_back(9527);
/*
插入数据到迭代器位置
iterator insert(const_iterator _Where, const _Ty& _Val)
iterator insert(const_iterator _Where, _CRT_GUARDOVERFLOW const size_type _Count, const _Ty& _Val){}
*/
testVector.insert(testVector.begin(), 100); // 在最前面插入元素
testVector.insert(testVector.end(), 4, 10); // 在最后面插入4个10
testVector.insert(testVector.begin()+3, 100); // 在第3个元素后插入元素(注意,若容器中不够3个元素则会发生异常)
/*
删除最后一个元素
void pop_back()
*/
testVector.pop_back();
/*
交换两容器的内容,收缩内存空间。
void swap(vector& _Right) noexcept
*/
std::vector<int> test2Vector = std::vector<int>{ 101,102,103 };
test2Vector.swap(testVector);
/*
返回vector大小。
_NODISCARD size_type size() const noexcept
*/
int size = testVector.size();
/*
下标获取元素值,注意不要越界。
_NODISCARD _Ty& operator[](const size_type _Pos)
索引获取元素值,注意不要越界。
_NODISCARD _Ty& at(const size_type _Pos)
*/
int value2 = testVector[2];
int value2 = testVector.at(2);
关注
笔者 - jxd (码农总动员)