ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【STL】vector - 顺序性容器

2022-09-12 21:00:47  阅读:199  来源: 互联网

标签:容器 vector end iterator loc STL 元素 Vector


vector的原理特点

vector是一个线性顺序结构,相当于数组,但是大小可以不预先指定,并且自动扩展。所以完全可以将vector看作动态数组。

在创建一个vector后,它会自动在内存中分配一块连续的内存空间进行数据存储,初始的空间大小可以预先指定也可以由vector默认指定,这个大小就是capacity()函数的返回值。当存储的数据超过分配的空间时vector会重新分配一块内存块,但这样的分配会比较耗时。会经历以下过程:

1.vector会申请一块更大的内存块
2.将原来的数据拷贝新的内存块中
3.销毁掉原内存块中的对象,(调用对象的析构函数)
4.将原来的空间释放掉

vector的特点:

(1)指定一块如同数组一样的连续存储,但空间可以动态扩展,可以像数组一样草最,并且可以动态操作。通常体现在push_back()和pop_back()。

(2)随机访问方便,支持[]操作符和vector.at()像数组一样被访问。

(3)节省空间,因为它是连续存储,在存储数据的区域都是没有被浪费的,但是在不满存的情况下,未存储的区域实际是被浪费的

(4)在内部进行插入、删除操作效率非常低,这样操作基本是被禁止的。vertor被设计成智能在后端进行追加和删除操作,原因是vector内部的实现是按照顺序表的原理

(5)只能在vector的最后进行push和pop,不能在vector的头进行push和pop

(6)当动态添加的数据超过vector默认分配的大小时要进行内存的重新分配、拷贝与释放,这个操作非常消耗性能,所以最好在创建vector时就指定空间大小

Vertors包含着一系列连续存储的元素,与数组类似。访问Vector中的任意元素或从末尾添加元素都可以在常量级时间复杂度内完成,从查找特定值的元素所处的位置或是Vector中插入元素则是线性事件复杂度

vector的类方法:

1.Constructors : 构造函数

// 构造一个空的vector
vector<int> v1;   

// 构造一个包含5个值为42的元素的Vector
vector<int> v1(5,42);   

2.Operators : 对vector进行赋值和比较

C++ Vectors能够使用标准运算符:==,!=,<=,>=,<,和> ;
要访问Vector中某特定位置的元素可以使用[]操作符;
如果两个vectors的容量相同,相同位置的元素相等则可以认为这两个vectors是相等的;
vectors之间大小的比较是按照词典规则;

3.assign():对Vecotr中的元素赋值

// 将区间[start,end]的元素赋给当前的vector
void assign(input_iterator start,input_iterator end); 

// 赋num个值为Val的元素到vector中,这个函数将会清除掉为vector赋值以前的内容
void assign(size_type num,const TYPE &val);     

4.at():返回指定位置的元素

5.back(): 返回最末尾的一个元素

6.begin(): 返回第一个元素的迭代器

7.capacity(): 返回vector所能容纳的元素数量

8.clear(): 清空所有元素

9.empty(): 判断Vector是否为空

10.end():返回最末元素的迭代器

11.erase():删除指定元素

// 删除loc处的元素
iterator erase(iterator loc);  

// 删除start和end之间的元素
iterator erase(iterator start,iterator end);   

12.front() : 返回第一个元素的引用

13.get_allocator(): 返回vector的内存分配器

14.insert():插入元素到Vector中

// 在指定位置Loc前插入值为num个值为val的元素
iterator insert(iterator loc,const TYPE &val); 

// 在指定位置loc前插入num个值为val的元素
void insert(iterator loc,size_type num,const TYPE &val);  

// 在指定位置loc前插入区间[start,end]的所有元素
void insert(iterator loc,input_iterator start,input_iterator end); 

15.max_size():返回Vector所能容纳元素的最大数量(上限)

16.pop_back():移除最后一个元素

17.push_back():在Vecotor尾添加一个元素

18.rbegin(): 返回Vector尾部的逆迭代器

19.rend():返回Vector起始的逆迭代器

20.reserve():设置Vector最小的元素容纳数量

21.resize():该表Vector元素数量的大小

22.size():返回Vector元素数量的大小

23:swap():交换两个Vector

void swap(vector &from);

vector实例

#include <iostream>
#include <vector>

using namespace std;

int main()
{
	// vector构造方法
	std::vector<int> iv;


	std::vector<int> iv1(10,5);
	for(const auto& e:iv1)
		cout<<e<<" ";
	cout<<endl;


	std::vector<int> iv2 = iv1;
	for(const auto& e:iv2)
		cout<<e<<" ";
	cout<<endl;
	cout<<endl;

 	// vector迭代器
 	int ar[] = {0,1,2,3,4,5,6,7,8,9};
 	std::vector<int> iv3(ar,ar+10);
 	for(const auto& e:iv3)
		cout<<e<<" ";
	cout<<endl;

	std::vector<int>::iterator it = iv3.begin();
	while(it != iv3.end())
	{
		cout<<*it<<" ";
		++it;
	}
	cout<<endl;

	auto it1 = iv3.begin();
	while(it1 != iv3.end())
	{
		cout<<*it1<<" ";
		++it1;
	}
	cout<<endl;
	cout<<endl;

	// 反向迭代器
	auto it2 = iv3.rbegin();
	while(it2 != iv3.rend())
	{
		cout<<*it2<<" ";
		++it2;
	}
	cout<<endl;
	cout<<endl;

	// vector元素变更
	vector<int> iv4;
	cout<<"size = "<<iv4.size()<<endl;
	cout << "capacity = " << iv4.capacity() << endl;
	iv4.push_back(1);
	iv4.push_back(2);
	iv4.push_back(3);
	iv4.push_back(4);
	iv4.push_back(5);
	cout << "size = " << iv4.size() << endl;
	cout << "capacity = " << iv4.capacity() << endl;
	cout<<endl;
	cout<<endl;


	iv4.resize(15);
	cout << "size = " << iv4.size() << endl;
	cout << "capacity = " << iv4.capacity() << endl;
	iv4.resize(10);//大小可以减小
	cout << "size = " << iv4.size() << endl;
	cout << "capacity = " << iv4.capacity() << endl;
	cout<<endl;
	cout<<endl;

	iv4.reserve(100);
	cout << "size = " << iv4.size() << endl;
	cout << "capacity = " << iv4.capacity() << endl;
	iv4.reserve(50);//扩容不能减少
	cout << "size = " << iv4.size() << endl;
	cout << "capacity = " << iv4.capacity() << endl;
	cout<<endl;
	cout<<endl;

	//增删改查
	for (const auto& e : iv4)
		cout << e << " ";
	cout << endl;
	iv4.pop_back();
	iv4.insert(iv4.begin(), 10);
	for (const auto& e : iv4)
		cout << e << " ";
	cout << endl;
	iv4.erase(iv4.begin());
	for (const auto& e : iv4)
		cout << e << " ";
	cout << endl;
	cout << endl;


	iv3.swap(iv4);//交换
	cout << "iv3 = ";
	for (const auto& e : iv3)
		cout << e << " ";
	cout << endl;
	cout << "iv4 = ";
	for (const auto& e : iv4)
		cout << e << " ";
	cout << endl;
	cout << endl;


	for (size_t i = 0; i < iv4.size(); ++i)
		cout << iv4[i] << " ";//[]不进行越界检测
	cout << endl;
	for (size_t i = 0; i < iv4.size(); ++i)
		cout << iv4.at(i) << " ";//会对边界进行访问越界问题进行检查
	cout << endl;

	for (size_t i = 0; i < (iv4.size()+1); ++i)
		cout << iv4[i] << " ";//[]不进行越界检测
	cout << endl;
	for (size_t i = 0; i < (iv4.size()+1); ++i)
		cout << iv4.at(i) << " ";//会对边界进行访问越界问题进行检查
	cout << endl;

	return 0;
} 
 

运行结果:
image











参考文章:C++_标准模板库(STL) - vector

标签:容器,vector,end,iterator,loc,STL,元素,Vector
来源: https://www.cnblogs.com/Wangzx000/p/16685000.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有