1.介绍STL
容器通用函数如下:
- .size():容器内的元素个数,无符号整型
- .empty():判断容器是否为空,返回一个bool值
- .front():返回容器第一个元素
- .back():返回容器最后一个元素
- .begin():指向容器第一个元素的指针。
- .end():指向容器最后一个元素的下一个位置的指针
- .swap(b):交换两个容器的内容
- ::iterator:迭代器
2.迭代器
迭代器是一个广义的指针,有时候可以认为他就是一个指针。模板使算法独立于存储的数据类型,而迭代器使算法独立于使用的容器类型。
for(vector<int>::iterator it=a.begin();it!=a.end();it++)
cout<<*it<<endl;
3.vector
vector(向量)是一个封装了动态大小数组的顺序容器(Sequence Container)。顺序容器中的元素按照严格的线性顺序排序。可以通过元素在序列中的位置访问对应的元素,支持数组表示法和随机访问。vector使用一个内存分配器动态处理存储需求。使用的时候加上头文件#include < vector>
(1)初始化 vector为什么叫容器,因为它可以存放各种类型的对象,可以是C++标准数据类型,也可以是结构体类型。
vector<int>a;
vector<int>a(100);
vector<int>a(10,666);
vector<int>b(a);
vector<int>b(a.begin()+3,a.end()-3);
vector<int>a[5];
(2)增加元素
往vector添加元素既可以加在后面,也可以加在中间,非常自由。但是效率很低。因为如果加在中间,那么以中间为起点往后面的所有元素都需要向后面移动。
a.push_back(5);
a.insert(a.begin()+1,10);
a.insert(a.begin()+1,5,10);
a.insert(a.begin()+1,b,b+3);
(3)删除元素
同增加一样,可以任意删除区间,位置的元素,当然,与增加元素类似。删除元素后,剩下的元素会紧密排列。
a.pop_back();
a.erase(a.begin()+1);
a.erase(a.begin()+3,a.end()-3);
a.clear();
(4)遍历元素
- 可以用数组表示法来遍历容器元素
- 可以用迭代器来遍历
for(int i=0;i<a.size();i++)
cout<<a[i]<<endl;
for(vector<int>::iterator it=a.begin(),it<a.end();it++)
cout<<*it<<endl;
(5)改变向量大小
resize可以改变当前向量的大小,如果它比当前向量大,则填充默认值;如果比当前小,则舍弃后面的部分。
a.resize(5);
(6)find find(begin,end,target)//在区间[begin.end]寻找target,返回找到的位置 下面用一个例子解释find,erase,insert函数
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
int a[] = { 1, 2, 3, 4 };
vector<int> v(a, a + sizeof(a) / sizeof(int));
vector<int>::iterator pos = find(v.begin(), v.end(), 3);
v.insert(pos, 30);
vector<int>::iterator it = v.begin();
while (it != v.end()) {
cout << *it << " ";
++it;
}
cout << endl;
pos = find(v.begin(), v.end(), 3);
v.erase(pos);
it = v.begin();
while (it != v.end()) {
cout << *it << " ";
++it;
}
cout << endl;
return 0;
}
4.栈(stack)
栈的特性就是先进后出,后进先出。在STL中,栈也是这样,只能对栈顶进行操作。需要头文件#include< stack>
stack<int> s;
s.push(x);
s.pop();
s.top();
s.empty();
s.size();
给一个例题来复习stack的使用 web导航
#include<iostream>
using namespace std;
#include<stack>
#include<cstring>
#include<string>
#include<cstdio>
int main()
{
stack<string>backward;
stack<string>forward;
string c="NULL";
string cur = "http://www.acm.org/";
while (cin >> c && c != "QUIT")
{
if (c == "VISIT")
{
backward.push(cur);
cin >> cur;
cout << cur << endl;
while (!forward.empty())
forward.pop();
}
else if(c=="BACK")
{
if (backward.empty())
cout << "Ignored"<<endl;
else
{
forward.push(cur);
cur = backward.top();
backward.pop();
cout << cur << endl;
}
}
else
{
if (c == "FORWARD")
{
if (forward.empty())
cout << "Ignored"<<endl;
else
{
backward.push(cur);
cur = forward.top();
cout << cur << endl;
forward.pop();
}
}
}
}
return 0;
}
下面是这个题目的图解:现在没时间,之后再贴上(2022,9.14. 19.05)
5.queue
队列的特点是先进先出,后进后出。 图解: 待补
- queue<int>q:创建一个队列,队列的元素类型是int
- push(x):x入队
- pop():出队
- front():取队头
- empty():判断队列是否为空,若为空,返回true
- size():求队列大小,返回元素个数
一个简单的例题复习队列 骑士移动
#include<iostream>
using namespace std;
#include<queue>
typedef struct
{
int x;
int y;
int step;
}Move;
int dx[8] = { -2,-2,-1,-1,1,1,2,2, };
int dy[8] = { 1,-1,2,-2,2,-2,1,-1 };
const int Max = 1000;
int map[Max][Max];
bool visit[Max][Max];
int main()
{
int N;
cin >> N;
while (N--)
{
memset(visit, false, sizeof(visit));
int L;
cin >> L;
Move start, end;
Move now;
queue <Move>q;
q=queue<Move>();
cin >> start.x >> start.y;
cin >> end.x >> end.y;
if (start.x == end.x && start.y == end.y)
{
cout << "0\n";
continue;
}
start.step = 0;
q.push(start);
visit[start.x][start.y] = 0;
int x, y,step=0;
while (!q.empty())
{
int break_break = 0;
start = q.front();
q.pop();
x = start.x;
y = start.y;
step = start.step;
for (int i = 0; i < 8; i++)
{
int tx = x + dx[i];
int ty = y + dy[i];
if (tx == end.x && ty == end.y)
{
step++;
cout << step << endl;
break_break = 1;
break;
}
if (tx >= 0 && tx < L && ty >= 0 && ty < L && !visit[tx][ty])
{
now.x = tx;
now.y = ty;
now.step = step + 1;
q.push(now);
visit[tx][ty] = true;
}
}
if (break_break == 1)
break;
}
}
return 0;
}
6.list
list是一个双向链表,可以在常数时间内插入和删除,不支持数组表示法和随机访问。使用时需要引入头文件#include< list>
list iterator的使用 函数声明 接口说明 begin() 返回第一个元素的迭代器 end() 返回最后一个元素下一个位置的迭代器 rbegin() 返回第一个元素的reverse_iterator,即end位置 rend() 返回最后一个元素下一个位置的reverse_iterator,即begin位置 cbegin() (C++11) 返回第一个元素的cosnt_iterator cend() (C++11) 返回最后一个元素下一个位置的const_iterator crbegin() (C++11) 即crend()位置 crend() (C++11) 即crbegin()位置
list 的专用成员函数
- merge(b): 将链表b与调用链表合并,在合并之前,两个链表必须已经排序,合并后经过排序的链表被保存在调用链表中,b为空。
- remove(val):从链表中删除val的所有节点。
- splice(pos,b):将链表b的内容插入pos的前面,b为空
- reverse():将链表翻转
- sort():将链表排序
- unique():将连续的相同元素压缩为单个元素。不连续的相同元素无法压缩,因此一般先排序后去重
其它成员函数如下:
- push_front(x): 将x从链表头插入
- push_back(x): 将x从链表尾插入
- front(): 返回链表头
- back(): 返回链表尾
- insert(p,t): 在p之前插入t
- erase§: 删除p
- clear(): 清空链表
|