CSP-J 总结 进阶三

一些基础知识

分配和释放:

C++的程序中有两种数组的声明方式:

一种是静态分配,类似int a[size]。一种是动态分配,类似int *a = (int *)malloc(size)。

静态分配:不需要释放。

  1. 如果写在函数里面,是在栈上分配,需要程序栈空间足够大,否则会出现栈溢出Crash。
  2. 如果写在函数外面,是在堆上分配,程序堆空间一般足够大,基本没有溢出的问题。

动态分配:堆上分配,C++有两种方式,malloc和new。

float *a = (float *)malloc(size); // 创建动态数组a,内存空间为size, 类型为float
free(a); // 删除或释放数组a
int *b = new int[size]; // 创建动态数组b,内存空间为size * sizeof(int), 类型为int
delete(b); // 删除或释放数组b

单向链表:

struct node {
struct node *next; // 下一个元素的指针
sturct v value; // 元素包含的数据
};
struct linklist {
    struct node *head;
    struct node *tail;
    int count; // optional, use it to get linklist count quickly.
};
// 初始化
struct linklist l;
l.head = l.tail = NULL;
l.count = 0;
// 插入尾部
l.tail->next = new struct node;
l.tail = l.tail->next;
l.tail->next = NULL;
l.tail.value = xxx;
// 插入到第idx个
struct node *a = NULL;
for (a = l.head; int cnt = 0; a != l.tail; a = a->next, cnt ++) {
    if (cnt == idx) {
        break;
    }
}
struct node * b = new struct node;
b->next = a->next;
a->next = b;
// 删除a的下一个元素
struct node * b = a->next;
a->next = b->next;
delete(b);

双向链表

struct node {
struct node *next; // 下一个元素的指针
struct node *prev;
sturct v value; // 元素包含的数据
};
struct linklist {
    struct node *head;
    struct node *tail;
    int count; // optional, use it to get linklist count quickly.
};
// 初始化
struct dlinklist l;
l.head = l.tail = NULL;
l.count = 0;
// 插入尾部
l.tail->next = new struct node;
l.tail->next->prev = l.tail;
l.tail = l.tail->next;
l.tail->next = NULL;
l.tail.value = xxx; // 给数据复制
// 插入到第idx个
struct node *a = NULL;
int cnt = 0;
for (a = l.head; a != l.tail; a = a->next, cnt++) {
//for (a = l.tail; a != l.head; a = a->prev, cnt++) { //从tail开始找idx个元素
    if (cnt == idx) {
        break;
    }
}
struct node * b = new struct node;
b->next = a->next;
b->next->prev = b;
b->prev = a;
a->next = b;
// 删除a的下一个元素
struct node * b = a->next;
b->next->prev = a;
a->next = b->next;
delete(b);

 STL简介

需要熟悉各种容器的用法,主要是方便后续代码编写,以及代码的阅读

标准模板库(Standard Template Library,STL)是惠普实验室开发的一系列软件的统称。在C++标准中,STL被组织为下面的13个头文件:<algorithm>、<deque>、<functional>、<iterator>、<vector>、<list>、<map>、<memory>、<numeric>、<queue>、<set>、<stack>和<utility>。

STL简介

STL简介(十分钟快速了解)-CSDN博客

序列式容器 : Sequence Containers , 容器中每个元素的位置都是固定的 , 元素的位置取决于插入元素的 时间 和 位置 , 与元素值无关 ; 例如向量Vector, 双端队列Deque, 列表List等。

关联式容器 : Associated Containers , 元素的位置与插入顺序无关 , 容器中有一个特定排序标准 , 默认是哈希值 ; 例如映射Map,集合Set,多重集合MultiSet等。Map类似python的字典。

STL中vector的用法:

#include <iostream>
#include <vector>
using namespace std;
 
int main() {
	// 初始化 
    vector<int> v; // 初始化一个int类型的vector,可以为float, double, struct xx等   

    v.push_back(1);      // 在vector末尾添加一个元素
    v.push_back(3);      // 当前的vector.size()是2,包含元素1, 3
    v.push_back(5);      // 当前的vecotr.size()是3,包含元素1, 3, 5
    v.pop_back();        // 当前的vector.size()是2,包含元素1, 3
    cout << "Front: " << v.front() << endl; // 访问vector的第一个元素,  1
    cout << "Back: " << v.back() << endl;   // 访问vector的最后一个元素, 3
    cout << "Size: " << v.size() << endl;   // 查询vector的大小, 2
    cout << "Capacity: " << v.capacity() << endl;// 查询vector的容量, 应该是8
    v.insert(v.begin() + 1, 2);             // 在指定迭代器的位置插入一个元素, 当前是1, 2, 3   
        // 遍历vector
    for (int i = 0; i < v.size(); i++) {
        cout << v[i] << " ";
    }
    cout << endl;
    v.erase(v.begin());     // 删除vector的第一个元素,注意v.begin是指针
    v[0] = 5;               // vector可以修改其某个位置的元素,类似数组  
    // 遍历vector
    for (int i = 0; i < v.size(); i++) {
        cout << v[i] << " ";
    }
    cout << endl;
    // NOTE:
    // v.begin(), v.end() 表示从左看的begin和end,是指针。
    // v.rbegin(), v.rend() 表示从right看的begin和end,是指针。
    // v.front(), v.back()表示vector的第一个和最后一个元素。
    // v.size() 表示vector当前的元素个数
    // v.capacity() 表示vector的容量,容量是指实际占用的内存数量。
    // 类似的int a[100], 可以认为容量是100,有效数据如果是90个,那么size是90. 
    
    // 初始化的其他用法
	vector<int> v1(5, 3); // 初始化一个size为5,初始值为3的向量
	vector<int> v2(v1);   // 将v1的元素复制到v2中,并初始化v2 
	vector<int> v3(v1.begin(), v1.begin() + 2); // 将v1从begin到begin + 2(不包含)的元素复制到v3并初始化v3  
    // insert的用法
	v1.insert(v1.begin()+1, 5); // insert到当前指针,值为5 
	v1.push_back(3); 
	// erase的用法
	v1.erase(v1.begin() + 3);
	v1.erase(v1.begin() + 2, v1.begin() + 4); //从某处开始删除到某处
	v1.at(0);  // 返回5这个位置的元素,等同于v1[5]; 
	v1.empty(); // 返回vector是否为空,bool类型
	// 迭代器:
	// v1.begin(), v1.end(), v1.rbegin(), v1.rend();
	// 同时可以执行
	v1.clear();
	return 0;
}

STL中List的用法:

STL的List是一个双向链表,相对于单向链表,增加了Prev指针,也就是node结构体会多占用一个指针的内存空间,但用起来会方便一些。

List的函数,比Vector只增加了push_front和pop_front函数方法,其他的类似。

STL中Deque的用法:

Deque是介于Vector和List之间的一个类,实现方式是List中的元素是一个Vector,这样索引速度比List快,插入产出速度比Vector快。 使用方法和Vector、List类似。

STL中栈和队列的用法:

请参考CSP-J 总结 进阶一-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值