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
}