C++顺序表和vector

线性表是n个具有相同特征的数据元素的有序序列 ------ 人话:每个元素的类型都是一致的,并且有先后顺序 数据表其实也就是一个相对简单的数据结构

线性表的存储结构:可以分为2种,用顺序存储实现的线性表就是顺序存储,链式存储

顺序存储:逻辑上相邻的元素,在内存中也存放在相邻的位置。实际上,线性表的顺序存储就是用数组来实现的

顺序表的实现方式:静态和动态。 动态的实现 通过new和delete来申请和释放空间。静态实现:直接创建一个足够大的数组,来充当顺序表。静态分配是直接向内存申请一大块连续的区域,动态是按需所取,合理的申请大小空间

创建:

const int N = 1e6 + 10; 根据实际情况而定

int a[N]; 用足够大的数组来模拟顺序表

int n; 标记顺序表里面有多少个元素

int main()

{

return 0;

}

添加一个元素:分为3种 尾插:在顺序表的后面插入一个新元素

头插:在顺序表的前面插入一个新元素

任意位置插入:在位置p处插入一个元素

const int N = 1e6 + 10;

int a[N];

int n;

void print()

{

for(int i = 1; i <= n; i++)

{

cout << a[i] << " ";

}

cout << endl << endl;

}

void push_back(int x) 尾插

{

a[++n] = x;

}

void push_front(int x) 头插

{

for(int i = n; i >= 1; i--)

{

a[i + 1] = a[i];

}

a[1] = x;

n++;

}

void insert(int x,int p) 任意位置插入

{

for(int i = n; i >= p; i--)

{

a[i + 1] = a[i];

}

a[p] = x;

n++;

}

int main()

{

push_back(2);

print();

push_back(5);

print();

push_back(1);

print();

push_back(3);

print();

return 0;

}

删除一个元素的操作:尾删、头删、任意删

void pop_back() 尾删

{

n--;

}

void pop_front(int x) 头删

{

for(int i= 2; i <= n; i++)

{

a[i - 1] = a[i];

}

n--;

}

void erase(int p) 任意位置删

{

for(int i = p + 1; i <= n; i++)

{

a[i - 1] = a[i];

}

n--;

}

查找元素:

//按值查找

int find(int x)

{

for(int i = 1; i <= n; i++)

{

if(a[i] == x)

return i;

}

return 0;

}

//按位查找 返回顺序表中第p位的元素

int at(int p)

{

return a[p];

}

修改元素

void change(int p, int x)

{

a[p] = x;

}

清空顺序表

void clear()

{

n = 0;

}

封装静态顺序表

vector的介绍 需要头文件为 #include<vector>

vector<int>a1; <> 里面放我要放的类型 创建一个名字为a1的可变长数组 里面都是int类型的数据

vector<int>a2(N); 创建一个大小为10的可变长数组,里面的值都初始化为0

vector<int>a3(N,2); 创建一个大小为10的可变长数组,里面的值都初始化为2

vector<int>a4 = {1,2,3,4,5};初始化列表的创建方式

vector<vector<int>> a5; 创建一个二维的可变长数组

vector<string> a6; 存字符串

vector<node> a7; 存结构体

vector<int> a8[N]; 创建了一个大小为N的vector数组

size 返回实际元素个数

void print(vector<int>&a)

{

for(int i = 0; i < a.size(); i++)

{

cout << a[i] << " ";

}

cout << endl;

}

empty 返回顺序表是否为空,因此是一个bool类型的返回值

if(a1.empty()) cout << "空" << endl;

else cout << "不空" << endl;

begin 返回起始位置的迭代器(左闭)

end 返回终点位置的下一个位置的迭代器(右开)

push_back:尾部添加一个元素

pop_back:尾部删除一个元素

当然还有insert 与 erase 不过由于时间复杂度过高,尽量不使用

front 返回首元素

back 返回尾元素

resize:修改vector的大小。如果大于原始大小,多出来的位置会补上默认值,一般是0。如果小于原始大小,相当于把后面的元素全部删掉

vector<int>aa(5,1);

print(aa);

aa.resize(10);

print(aa);

aa.size(3);

print(aa);

clear:清空vector

vector<int>aa(5,1);

cout << aa.size() << endl;

aa.clear();

cout << aa.size() << endl;

pair 用于将两个值组合成一个单一的对象,通常用于存储值对应或返回多个值,它有两个公有成员 first 和 second ,分别表示第一个值和第二个值

pair<第一个关键字的类型,第二个关键字的类型> pair<int,int>p1;

一般使用pair的时候会进行 typedef

相关推荐
浅念-几秒前
C ++ 智能指针
c语言·开发语言·数据结构·c++·经验分享·笔记·算法
布谷歌1 分钟前
Fastjson枚举反序列化:当字符串不是枚举常量名时,会发生什么?
开发语言·python
虚幻如影1 分钟前
python识别验证码
开发语言·python
不染尘.1 分钟前
最小生成树算法
开发语言·数据结构·c++·算法·图论
ChineHe4 分钟前
基础篇003_Python基础语法
开发语言·人工智能·python
Klong.k15 分钟前
判断是不是素数题目
数据结构·算法
QQsuccess15 分钟前
AI全体系保姆级详讲——第一部分:了解AI基本定义
人工智能·算法
NX-二次开发17 分钟前
UG CAM API 获取、设置切削层中的切削方式类型方法,如设置仅底面、恒定、临界深度的类型
c++
_日拱一卒18 分钟前
LeetCode:移动零
算法·leetcode·职场和发展
沉沙丶20 分钟前
关于matlab分析电流THD的一些探究和记录
开发语言·matlab·电机控制·foc·永磁同步电机·模型预测·预测控制