C++ —— STL - Vector

说明

     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      (码农总动员)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

信必诺

嗨,支持下哥们呗。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值