https://zhuanlan.zhihu.com/p/381045908
https://blog.youkuaiyun.com/weixin_41232202/article/details/92437118
0.array数组
重点参考引用和代码注释部分!
https://blog.youkuaiyun.com/newson92/article/details/109879873
数组是一个集合,存储一个固定大小的相同类型元素的顺序集合。
特点1:数组中的每个数据元素具有相同的数据类型。
特点2:数组占用一段连续的内存空间。
//数组
int array[] = {100, 1, 2, 3, 4, 5};
int length = sizeof(array)/sizeof(array[0]);
std::cout << "array first element address:" << array << std::endl;
std::cout << "array sizeof: " << sizeof(array) << std::endl;
std::cout << "array[0] sizeof: " << sizeof(array[0]) << std::endl;
std::cout << "array length:" << sizeof(array)/sizeof(array[0]) << std::endl;
for(int i = 0; i < length; i++){
int* add = &array[i];
int* add1 = array + i;//和int* add = &array[i];效果相同
cout << add << endl;
cout << add1 << endl;
}
std::cout << "array: " << array << std::endl;//数组的首个元素地址
std::cout << "&array: " << &array << std::endl;//整个数组的地址,输出的地址与array相同,但是表达含义不同。
std::cout << "*array: " << *array << std::endl;//输出为首地址的元素数值
std::cout << "**(&array): " << **(&array) << std::endl;//输出为首地址的元素数值
int* arr[10] = {array};
std::cout << "arr: " << arr << std::endl;//int和int*是不一样的.加了* 就意味着是指针了,arr里面存放的时int*指针
std::cout << "&arr: " << &arr << std::endl;
std::cout << "**(&arr): " << **(&arr) << std::endl;
1. vector
vector : C++ STL中的顺序容器,封装数组
拥有一段连续的内存空间,能非常好的支持随即存取,即[]操作符,但由于它的内存空间是连续的,所以在中间进行插入和删除会造成内存块的拷贝,另外,当插入较多的元素后,预留内存空间可能不够,需要重新申请一块足够大的内存并把原来的数据拷贝到新的内存空间。这些影响了vector的效率,但是实际上用的最多的还是vector容器,建议大多数时候使用vector效率一般是不错的。vector的用法解析可以参考本人的另一篇随笔:http://www.cnblogs.com/BeyondAnyTime/archive/2012/08/08/2627666.html
用法:https://blog.youkuaiyun.com/qiancm/article/details/119611928
详解:https://blog.youkuaiyun.com/msdnwolaile/article/details/52708144?spm=1001.2101.3001.6650.6&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-6-52708144-blog-119611928.235%5Ev26%5Epc_relevant_3mothn_strategy_and_data_recovery&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-6-52708144-blog-119611928.235%5Ev26%5Epc_relevant_3mothn_strategy_and_data_recovery&utm_relevant_index=11
//Vector
//初始化
vector<int> vec0(5, 100);//初始化第一位为个数,第二位为数值。(结果为5个100)
vector<int> vec1{1, 2, 3, 4};
vector<int> vec2(vec1);
//访问
vec0.at(1) = 1;//用at访问,可直接修改对应数值
vec0[0] = 0;//用下标访问,,可直接修改对应数值
cout << "vec0.at(1): " << vec0.at(1) << endl;
cout << "vec0[0]: " << vec0[0] << endl;
//insert,插入元素
vec0.insert(vec0.begin()+5, 10);//insert(位置,插入的数值)
//vec0.insert(vec0.end(), 100);
//push_back,末尾添加元素
vec0.push_back(1);//押入
//pop_back(),末尾删除元素
int capacity = vec0.capacity();
cout << "capacity: " << capacity << endl;
vec0.pop_back();//删除末尾的元素,不需要传入任何的参数,也没有返回值。容器的大小减了 1,但容量没变
int capacity_pop = vec0.capacity();
cout << "capacity_pop: "<< capacity_pop << endl;
//erase,删除 vector 容器中指定位置处的元素
auto iter = vec0.erase(vec0.begin()+3);//erase() 函数在删除元素时,会将删除位置后续的元素前移,并将容器的size减1,容量不变
int capacity_erase = vec0.capacity();
cout << "capacity_erase: "<< capacity_erase << endl;
先进后出容器,LIFO: Last In First Out。std::vector 相当于可以改变大小的数组 (array)。首先,和数组一样,vector 也使用连续内存空间来存放元素,因此同样可以用“指针+偏移”的方式来访问各个元素。可以说它是一种顺序结构的动态数组,也就是说vector容器本质上来说是可以索引的。但 vector 还能够自动地管理和扩展其存贮空间。
vector的访问方式:at和下标访问
https://blog.youkuaiyun.com/a10201516595/article/details/94188902?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-94188902-blog-108802752.pc_relevant_3mothn_strategy_and_data_recovery&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-94188902-blog-108802752.pc_relevant_3mothn_strategy_and_data_recovery&utm_relevant_index=2
2. queue(队列)和deque(双端队列)
先进先出型容器,FIFO: First In First Out。queue是一种专门为“先进先出”情形设计的容器,且只支持先进先出,只支持访问头尾的两个元素。
queue用法:https://blog.youkuaiyun.com/KEPROM/article/details/109744379?spm=1001.2101.3001.6650.7&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EOPENSEARCH%7ERate-7-109744379-blog-129700512.235%5Ev26%5Epc_relevant_3mothn_strategy_and_data_recovery&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EOPENSEARCH%7ERate-7-109744379-blog-129700512.235%5Ev26%5Epc_relevant_3mothn_strategy_and_data_recovery&utm_relevant_index=8
queue和deque对比:https://blog.youkuaiyun.com/qq_25800311/article/details/89060069
优先队列: https://blog.youkuaiyun.com/chao_xun/article/details/8037438?spm=1001.2101.3001.6650.5&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-5-8037438-blog-89060069.pc_relevant_3mothn_strategy_and_data_recovery&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-5-8037438-blog-89060069.pc_relevant_3mothn_strategy_and_data_recovery&utm_relevant_index=9
//queue
std::queue<int> que;
que.push(1);
que.push(2);
que.push(3);
que.push(4);
que.push(5);
cout<<"que.size "<<que.size()<<endl;
cout<<"que.front "<<que.front()<<endl; //输出栈顶元素
que.pop(); //删除栈顶元素
cout<<"que.size "<<que.size()<<endl;
cout<<"que.front "<<que.front()<<endl;
3.stack栈
先进后出时,选用stack容器
用法详解: https://blog.youkuaiyun.com/weixin_52341477/article/details/119250698
//stack
stack<int> q;
q.push(1);
q.push(2);
q.push(3);
q.push(4);
q.push(5);
cout<<"q.size "<<q.size()<<endl;
cout<<"q.top "<<q.top()<<endl; //输出栈顶元素
q.pop(); //删除栈顶元素
cout<<"q.size "<<q.size()<<endl;
cout<<"q.top "<<q.top()<<endl;
4.list
list是双向循环链表,,每一个元素都知道前面一个元素和后面一个元素。在STL中,list和vector一样,是两个常被使用的容器。和vector不一样的是,list不支持对元素的任意存取。list中提供的成员函数与vector类似,不过list提供对表首元素的操作push_front、pop_front,这是vector不具备的。它的内存空间是不连续的,通过指针来进行数据的访问,这个特点使得它的随即存取变的非常没有效率,因此它没有提供[]操作符的重载。但由于链表的特点,它可以以很好的效率支持任意地方的删除和插入。
https://blog.youkuaiyun.com/yas12345678/article/details/52601578
https://blog.youkuaiyun.com/whz_zb/article/details/6831817?spm=1001.2101.3001.6650.6&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-6-6831817-blog-52601578.235%5Ev27%5Epc_relevant_3mothn_strategy_and_data_recovery&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-6-6831817-blog-52601578.235%5Ev27%5Epc_relevant_3mothn_strategy_and_data_recovery&utm_relevant_index=12