一些基础知识
分配和释放:
C++的程序中有两种数组的声明方式:
一种是静态分配,类似int a[size]。一种是动态分配,类似int *a = (int *)malloc(size)。
静态分配:不需要释放。
- 如果写在函数里面,是在栈上分配,需要程序栈空间足够大,否则会出现栈溢出Crash。
- 如果写在函数外面,是在堆上分配,程序堆空间一般足够大,基本没有溢出的问题。
动态分配:堆上分配,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>。
序列式容器 : 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类似。