静态数组和动态数组的区别
C语言自带的数组不够灵活 例int arr[10];
静态数组缺点:
长度不可修改;局部变量长度不能超过一兆 全局变量有题目限制;数组作为参数不方便 不知道长度只有数组首地址
解决方法:纯C 弄一个固定大小的数据 局部不够用全局 全局放不下 考虑算法问题 传参传两个参数;C++ 动态数组STL vector
学习方法:
学习别人写好的数据结构 四个方面增删查改
增:构造和初始化;插入
查:访问某一个元素 整个vector怎么遍历 元素信息反过来找位置 查找算法
改:修改数据
删除:删除某个;全部清空
新的工具:迭代器
iterator 通用方法可以访问不同种类的数据结构 可以理解成高级版本的指针
迭代器定义:动态数组的类型::iterator
例: vector ::iterator
调用begin()函数获得起始位置和end()函数尾后位置,迭代器可以获取元素的位置, insert会修改动态数组的结构,插入完成以后it的指向无意义
it=it+3 相当于三次++ 只能在vector中使用
vector在中间插入效率低 最好还是用push_back在尾部插入
list的使用提升在中间插入删除的效率
list中使用erase和insert效率更高一点
优先使用vector然后再考虑list
#include <iostream>
#include <vector>//vector头文件
#include <list>//list头文件
using namespace std;
int main(){
vector<int>::iterator it1;
vector<int> vec1(10);//创建size为10的数组 元素类型是int 初始值默认为0
//插入数据 push_back尾部进行插入效率高 在中间插入效率很低
for(int i=0;i<10;++i){
vec1.push_back(i);
}//插入到末尾
for(it1=vec1.begin();it1!=vec1.end();++it1){
printf("%d ",*it1);//这里使用的是*it1
}
printf("\n");
//随机插入
//查找 根据数组下标访问对应元素 支持随机访问 数组下标范围与静态数组一致
vector<int> vec2={1,3,5,7,9};
printf("%d ",vec2[1]);
//获取vector的长度 vector.size()
int size=vec2.size();
printf("%d ",size);
//迭代器 通用方法访问不同种类的数据结构 高级版本指针
//定义迭代器 间接访问数组中的内容 支持自增操作
for(it1=vec2.begin();it1!=vec2.end();++it1){
printf("%d ",*it1);//这里使用的是*it1
}
printf("\n");
it1=vec1.begin();
//能够往中间插入删除
vec1.insert(it1,2);
for(it1=vec1.begin();it1!=vec1.end();++it1){
printf("%d ",*it1);//这里使用的是*it1
}
//迭代器可以获取元素的位置 插入完成之后it的指向就失效了 还想要使用要重新赋值
//删除clear将整个动态数组中的元素全部清空
//pop_back()删除最后一个元素
//删除中间的元素 还要使用erase
it1=vec1.begin();
vec1.erase(it1);
for(it1=vec1.begin();it1!=vec1.end();++it1){
printf("%d ",*it1);//这里使用的是*it1
}
//中间插入删除使用list 不支持随机访问
//链表中不能使用it=it+1;只能用it++ 迭代器
}