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

相关推荐
froginwe118 小时前
JavaScript 函数调用
开发语言
独望漫天星辰8 小时前
C++ 多态深度解析:从语法规则到底层实现(附实战验证代码)
开发语言·c++
We་ct8 小时前
LeetCode 56. 合并区间:区间重叠问题的核心解法与代码解析
前端·算法·leetcode·typescript
Lionel6898 小时前
分步实现 Flutter 鸿蒙轮播图核心功能(搜索框 + 指示灯)
算法·图搜索算法
无小道8 小时前
Qt——事件简单介绍
开发语言·前端·qt
小妖6668 小时前
js 实现快速排序算法
数据结构·算法·排序算法
xsyaaaan8 小时前
代码随想录Day30动态规划:背包问题二维_背包问题一维_416分割等和子集
算法·动态规划
devmoon8 小时前
在 Paseo 测试网上获取 Coretime:On-demand 与 Bulk 的完整实操指南
开发语言·web3·区块链·测试用例·智能合约·solidity
kylezhao20199 小时前
C# 中的 SOLID 五大设计原则
开发语言·c#