复试机试【枚举和模拟-下】:二、动态数组Vector和链表List的使用

2 线性数据结构相关的模拟问题

传统C语言数组

不够灵活

①数组长度不可修改 所以一开始就要设置为比较大的数组

②局部数组 数组长度不能超过1MB

​ 全局数组 可能超过题目的内存限制

③!!!数组作为函数参数不方便!!!

​ 被调函数只能拿到第一个元素 不知道数组的长度

纯C怎么解决

一开始就申请比较大的数组 如果数据量很大 就放在全局 局部不够就放在全局

传参的时候 传两个参数 地址+长度

C++用Vector动态数组

掌握动态数组的【增删查改】,这是后面各个数据结构使用的关键

【增】从无到有 构造;创建的一开始就给数值 初始化;已经有了这个数组 插入

【查】访问某一个元素;遍历整个数组;知道某个元素长什么样 找在什么位置

【改】

【删】删除一个;全部清空

迭代器

interator提供一种通用方法 可以访问不同种类的数据结构

在这里插入图片描述

vector和list的使用

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
using namespace std;

//引入【vector头文件】不需要.h
#include<vector>

//引入【list链表头文件】
#include<list>

//自己定义的类 也可以用于vector
struct MyType {
	int val1;
	double val2;
};

int main() {

	//【增】【初始化 构造】

	//vector不是类型 vector<int>才是类型
	vector<int> vec1;
	vector<double> vec2;

	//自定义类型也可以
	vector<MyType> vec3;

	//本身也可以作为类型 数组的数组 二维数组
	vector<vector<int>> vec4;

	//机试推荐用法 动态数组的静态数组
	vector<int> arr[10];





	//【增】【添加元素】
	
	//一开始就申请了100个元素的内存
	vector<int> vec5(100);
	
	int a = 1;
	//在尾部添加元素【push_back】
	vec1.push_back(a);
	

	//访问时 数组下表不能越界
	vector<int> vec6 = { 1,3,5,7,9 };
	
	//如何获取【数组长度】
	//vector本身就包含了长度信息
	int size = vec6.size();
	
	//遍历数组 传统方法
	for (int i = 0; i < size; i++) {
		printf("%d", vec6[i]);
	}
	
	//遍历数组 【迭代器】
	vector<int>::iterator it;

	/*
	vector<int>
	这是一个整数向量 它可以存储多个整数

	:: 
	这是一个作用域解析运算符 
	用于指定一个特定的类型或变量在某个命名空间或类的作用域内
	
	iterator
	这是vector容器提供的一个迭代器类型
	迭代器可以看作是一个指针 它指向容器中的元素
	你可以使用迭代器来遍历容器的元素
	
	it
	这是迭代器的变量名
	可以使用这个迭代器来遍历和访问 vector<int> 中的元素
	*/

	//【迭代器遍历】
	for (it = vec6.begin(); it != vec6.end(); it++) {
		printf("*it=%d\n", *it);//类似指针
	}
	/*
	it 
	是一个迭代器,用于遍历 vec6

	it = vec6.begin() 
	将迭代器 it 初始化为指向 vec6 的第一个元素

	it != vec6.end() 
	是循环条件,只要 it 不等于 vec6.end(),循环就会继续执行
	
	it++ 
	在每次循环迭代结束时将迭代器向前移动一个位置
	
	*/

	//【插入】少用 尽量用push_back
	vector<int>::iterator it2;
	it2 = vec6.begin();//指向数组元素1
	vec6.insert(it2, 2);//在it2的位置 插入元素2
	//当前位置及其之后的元素都后移
	

	//【删】
	
	
	//只删除最后一个数据
	vec6.pop_back();

	//删除指定位置元素
	it = vec6.begin() + 1;
	vec6.erase(it);

	//删除全部数据
	vec6.clear();



	//【链表】的使用 和vector一样
	list<int> ls1 = { 1,3,5,7,9 };
	list<int>::iterator it3 = ls1.begin();
	//链表不支持随机访问 不能用it3=it3+2
	it3++;
	it3++;
	printf("*it3=%d\n", *it3);
	ls1.erase(it3);
	for (it3 = ls1.begin(); it3 != ls1.end(); it3++) {
		printf("after erase=%d\n", *it3);
	}

	//如何选择【vector和list】
	//默认选择vector
	//如果要大量进行插入和删除的操作
	//就选择list


	return 0;
}


不能用it3=it3+2
	it3++;
	it3++;
	printf("*it3=%d\n", *it3);
	ls1.erase(it3);
	for (it3 = ls1.begin(); it3 != ls1.end(); it3++) {
		printf("after erase=%d\n", *it3);
	}

	//如何选择【vector和list】
	//默认选择vector
	//如果要大量进行插入和删除的操作
	//就选择list
}
  • 20
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值