IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> vector类(动态数组)——STL -> 正文阅读

[数据结构与算法]vector类(动态数组)——STL

vector

向量(动态数组),内存的分配原理跟string是一样的,是连续的空间,如果空间不够用,会申请一个更大的连续的空间,同时迭代器失效

区别于array,array是一个数组,容量固定。

  • 需要添加头文件:#include <vector>

定义vector对象

定义一个int类型的向量

无参构造
	vector<int> vec ; 
	vector<int> vec2 ;
	
有参构造,含有5个元素
	vector<int> vec1(5);
	
有参构造,初始化,540
	vector<int> vec2(5, 40);
	
拷贝构造
	vector<int> vec3(vec1);

定义vector的迭代器

	vector<int>::iterator ite;
	<>中是参数列表, string则没有
	本质就是int* 指针,char 就是char*指针

迭代器初始化

	vector<int> vec2(5, 40);
	
	vector<int>::iterator ite = vec2.begin();
	vector<int>::iterator ite1 = vec2.end();
  • begin(),指向头
  • end(),指向尾巴的下一个

注意:vector的下标运算符例如a[1],只能在以存在的数据中查找,或者修改已存在的值,不能进行赋值运算

vector容量

  • 无参初始化,容量就为0
  • 有参初始化,有几个元素,容量就为几
  • 新增数据,容量不够时增加现有容量的一半。比如现有10个,新的就是15个(10+10/2=15),现有13个;增加13/2==6个,就是19个
  • 但是新增数据时,容量的变化,不同的编译器,容量变化不同可以试验一下
  • push_back实在数组后面追加一个元素
	vector<int> vec;
	cout << vec1.capacity() << endl;
	
	vector<int> vec1(5);
	cout << vec1.capacity() << endl;  //为5

	vec1.push_back(1); // 追加一个元素 
	cout << vec1.capacity() << endl; //5+5/2 == 7

	vec1.push_back(1);
	vec1.push_back(1); //7 + 7/2 == 10
	

修改容量

  • 关键词:reserve()

  • 修改容量,不能变小,只能变大

  • 设置多大就是多大

	vector<int> vec;
	vec.resize(3);
  • size(),元素个数

  • resize(),重新设置元素个数

  • 缩小时容量不变,放大时容量改变,缩小的时候,字符串的长度可能会被截短

  • 判断对象是否有元素empty()
    为空就返回0,不为空显示1

重新分配容量后,迭代器失效

vector的操作

添加元素

1. 尾添加

void push_back( const TYPE &val );

	vec.push_back(2);

2. 中间添加

在指定迭代器的位置加入一个数据
iterator insert( iterator loc, const TYPE &val );

	再迭代器vec下标为2,的位置添加元素12
	原数据整体向后移
	vec.insert(vec.begin()+2 , 12);

在某个迭代器后加入num个值为value的元素
void insert( iterator loc, size_type num, const TYPE &val );

	再迭代器vec下标为2的位置,添加512
	vec.insert(vec.begin()+2, 5 , 12 );

某个迭代器后加入另一个向量的中间一段
void insert( iterator loc, input_iterator start, input_iterator end );

	vector<int> vec(8,4);
	vector<int> vec1(5,1);

	在vec下标为3的位置,添加vec1中从头开始的三个元素,下标为013
	vec.insert(vec.begin()+3, vec1.begin(), vec1.begin()+3);

区别

  • 由于是数组,尾添加效率非常高,不考虑重新增加空间
  • 中间添加的效率很低

查找

全部输出

  1. 循环添加,然后用下标法输出
	for (int i = 0; i < 10; i++)  //[]
	{
		vec.push_back(i);
	}

	for (int i = 0; i < 10; i++)
	{
		cout << vec[i] << endl;
	}
  1. 迭代器输出
	vector<int> vec;
	vector<int>::iterator ite = vec.begin();
	for_each(vec.begin(), vec.end(), fun);

单个输出

  1. 下标运算
	cout << vec[i] << endl;
  1. at()
	cout << vec.at(i) << endl;
  • at区别于下标的好处是,当下标越界的时候,at会抛出异常,但是下标方法会直接崩溃
  1. back()返回尾巴的元素
	cout << vec.back();

删除

尾删除

void pop_back();

	vec.pop_back();

删除指定元素

  1. 删除一个: iterator erase( iterator loc );
	删除下标为3的元素
	vec.erase(vec.begin()+3);
  1. 删除一段:iterator erase( iterator start, iterator end );
	删除下标从3开始到最后的所有元素
	vec.erase(vec.begin()+3, vec.end());
  1. 删除所有:void clear();

修改

用下标运算修改

交换

void swap( vector &from );

	交换连个迭代器的内容
	vec.swap(vec1);

运算符重载

在这里插入图片描述

算法

需要添加头文件:#include <algorithm>

排序

  • 关键词:sort(),默认从小到大排序
  • 添加greater<数据类型>(),指定从大到小排序

可以把整个迭代器排序,也可以拍迭代器中的一段

	vector<int> vec;
	vec.push_back(8);
	vec.push_back(51);
	vec.push_back(11);
	vec.push_back(4);
	vec.push_back(0);
	vec.push_back(10);
	vec.push_back(18);
	
	将下标从25的元素,从小到大排序
	sort(vec.begin()+2 , vec.begin()+5)
	将所有元素从大到小排序
	sort(vec.begin(), vec.end(), greater<int>());

随机打乱顺序

	vec.push_back(1);
	vec.push_back(2);
	vec.push_back(3);
	vec.push_back(4);
	vec.push_back(5);
	
	会将上面的vec随机打乱顺序输出,但是当运行多次都是第一次打乱顺序的次序
	random_shuffle(vec.begin(), vec.end());

想要让每次运行出现的值不一样,需要添加一个系统时间time(),这是需要添加一个ctime头文件。

	srand((unsigned int)time(0));

	random_shuffle(vec.begin(), vec.end());
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-04-29 12:21:18  更:2022-04-29 12:25:00 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 5:25:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码