序列型容器
其中的元素都是可排序的(ordered),STL提供了vector,list,deque等序列式容器,而stack,queue,priority_queue则是容器适配器
数组
概念
- 代表内存里一组连续的同类型存储区
- 可以用来把多个存储区合并成一个整体
比如int arr[10] = {1,2,3,4,5,6};


差一错误(off-by-one error)



下面的Index应为0



数组的访问 数组的访问效率比较高

数组长度的获取
len = sizeof(a)/sizeof(a[0]); //获取数组长度
二维数组

#include <iostream>using namespace std;#include <vector>int main(){// 数组访问//int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 0, 0};// 推荐方式//for (int index = 0; index < 10; ++index)// cout << a[index] << " ";//cout << endl;// 不推荐方式//for (int index = 0; index <= 9; ++index)// cout << a[index] << " ";// 数组的查找//int a[] = { 1, 2, 3, 4 };//int len = sizeof(a) / sizeof(a[0]);//得到数组容量//for (int index = 0; index < len; ++index)//{// if (a[index] == 5)// {// cout << index << endl;// return 0;// }//}//二维数组的访问:int a[2][4] = { { 1, 2, 3, 4 },{ 5,6,7,8 } };for (int row = 0; row < 2; ++row){for (int col = 0; col < 4; ++col){cout << a[row][col] << " ";}cout << endl;}return 0;}
vector





#include <iostream>#include <vector>using namespace std;int main(){// 创建动态数组vectorvector<int> vec = { 1,2,3,4 };cout << "size is " << vec.size() << endl;cout << "capacity is " << vec.capacity() << endl;// 遍历所有元素for (int index = 0; index < vec.size(); ++index){cout << vec[index] << endl;}// 在尾部插入一个元素5vec.push_back(5);cout << "size is " << vec.size() << endl;cout << "capacity is " << vec.capacity() << endl;// 遍历所有元素for (int index = 0; index < vec.size(); ++index){cout << vec[index] << endl;}// 在中间插入一个元素6 查找的元素前面插入vec.insert(--vec.end(), 6);cout << "size is " << vec.size() << endl;cout << "capacity is " << vec.capacity() << endl;// 遍历所有元素for (int index = 0; index < vec.size(); ++index){cout << vec[index] << endl;}// 在尾部移除一个元素vec.pop_back();cout << "size is " << vec.size() << endl;cout << "capacity is " << vec.capacity() << endl;// 遍历所有元素for (int index = 0; index < vec.size(); ++index){cout << vec[index] << endl;}// 在任意位置移除一个元素vec.erase(vec.end() - 2);cout << "size is " << vec.size() << endl;cout << "capacity is " << vec.capacity() << endl;// 遍历所有元素for (int index = 0; index < vec.size(); ++index){cout << vec[index] << endl;}return 0;}
vector是面向对象方式的动态数组,容量可以自动增长
使用最简单的数组,无法实现动态扩容插入元素,因为容量有限
插入
vec.insert(—vec.end(), 4);
删除
vec.pop_back()
vec.erase(vec.end()-1)
#include <iostream>#include <string>#include <vector>#include "mylog.h"#include "testVector.h"using namespace std;vector<string> allName;void test01(){allName.push_back("111");allName.push_back("222");allName.push_back("333");allName.clear();LOG("容器的内存大小是:%d", allName.capacity());// 替换的方式:来解决此问题vector<string> tempVector; // 定义临时容器目的:就是为了解决 、 替换全局容器,让全局容器不占用内存空间tempVector.swap(allName); // 把全局的 全部移动 给临时 == 把全局的给回收了LOG("容器的内存大小是:%d", allName.capacity());} // 函数一弹栈 tempVector给回收了,就保证了,全局和临时全部回收完毕void main_testVector(){// C++ 中容器,分为两种类型 vector栈的数据结构// 1.序列式容器:元素的排序关系,和元素本身没有任何关系,是我们在添加的时候导致的顺序导致的排序vector<int> vec01(1);vector<const char *> vec02(100, "肚子腾");vector<const char *> vec03;//添加元素vec03.push_back("A");vec03.push_back("B");vec03.push_back("C");//删除元素vec03.pop_back();//查const char * value1 = vec03.at(0);const char * value2 = vec03.at(1);LOG("第一个元素是:%s", value1);LOG("第二个元素是:%s", value2);// 遍历vector<const char *>::iterator beginResult = vec03.begin();vector<const char *>::iterator endResult = vec03.end();for(;beginResult != endResult; beginResult++){LOG("遍历到的元素是:%s", *(beginResult));}vec03.clear();LOG("此容器的内存空间是:%d", vec03.capacity());// test01();}
queue
#include <iostream>#include <queue>#include "mylog.h"#include "testQueue.h"using namespace std;void main_testQueue(){queue<int> queue1;//增queue1.push(1);queue1.push(2);queue1.push(3);//删queue1.pop();int front = queue1.front();int back = queue1.back();int size = queue1.size();LOG("队头元素是:%d", front);LOG("队尾元素是:%d", back);LOG("队列元素个数是:%d", size);//队列不建议遍历}
stack栈
#include <iostream>#include <stack>#include "mylog.h"#include "testStack.h"using namespace std;//栈先进后出void main_testStack(){stack<int> stack1;//增stack1.push(1);stack1.push(2);stack1.push(3);//删stack1.pop();//查int top = stack1.top();LOG("栈顶部元素是:%d", top);}
优先级队列priority_queue
#include <iostream>#include <stack>#include "mylog.h"#include "testStack.h"using namespace std;//栈先进后出void main_testStack(){stack<int> stack1;//增stack1.push(1);stack1.push(2);stack1.push(3);//删stack1.pop();//查int top = stack1.top();LOG("栈顶部元素是:%d", top);}
关联式容器
通过一个关键字 来保存 和 访问 元素的,当元素被插入到容器时,按其建以某种特定规则放入适当位置 例如:Java中的 map set 都是关联式容器
map
#include <iostream>#include <string>#include <map>#include "mylog.h"#include "testMap.h"using namespace std;void main_testMap() {map<int, char> map1;//增map1.insert(pair<int, char>(1, 'c'));map1.insert(pair<int, char>(2, 'g'));map1.insert(pair<int, char>(3, 'd'));//删map1.erase(1);//改map1.insert(pair<int, char>(1, 'e'));//查map<int, char>::iterator iterator2 = map1.find(1);LOG("第一个元素key=%d, value=%c", iterator2->first, iterator2->second);//遍历map<int, char>::iterator iteratorBegin = map1.begin();map<int, char>::iterator iteratorEnd = map1.end();for (; iteratorBegin != iteratorEnd; iteratorBegin++) {LOG("遍历的元素key=%d, value=%c", iteratorBegin->first, iteratorBegin->second);}}
set
#pragma once;#include <iostream>#include <string>#include <set>#include <vector>#include "testSet.h"#include "mylog.h"using namespace std;void main_testSet() {set<int> set1 = {1, 2, 3, 4, 5};//增set1.insert(777);set1.insert(888);set1.insert(999);//改set1.insert(1); // 重复的元素添加不进去,因为set不允许添加重复的元素//删除元素set1.erase(1);//查set<int>::iterator iterator1 = set1.find(777);LOG("查找到的元素是:%d", *iterator1);//set遍历set<int>::iterator beginResult = set1.begin();set<int>::iterator endResult = set1.end();for (; beginResult != endResult; beginResult++) {LOG("查找的元素是%d", *beginResult);}}
迭代器
是一种smart pointer,用于访问顺序容器和关联容器中的元素,相当于容器和操纵容器的算法质检的中介
迭代器按照定义方式分为以下四种
1.正向迭代器: iterator
2.常量正向迭代器:const_iterator
3.反向迭代器:reverse_iterator
4.常量反向迭代器:const_reverse_iterator




