好久没有更博呀都快一个月了呢~最近AC出现问题最多的就是数据结构了。
然后正好在学C++,应我小伙伴wyp的要求,我整理了STL模板的使用,供大家参考。
1. vector
(1)头文件#include<vector>.
(2)创建vector对象,vector<int>vec;
(3)尾部插入数字:vec.push_back(a);
尾部删除数字:vec.pop_back(a);
(4)使用下标访问元素,cout<<vec[0]<<endl;记住下标是从0开始的。
(5)使用迭代器访问元素.
vector<int>::iterator it;
for(it=vec.begin();it!=vec.end();it++)
cout<<*it<<endl;
(6)插入元素:vec.insert(vec.begin()+i,a);在第i+1个元素前面插入a;
(7)删除元素:vec.erase(vec.begin()+2);删除第3个元素
vec.erase(vec.begin()+i,vec.end()+j);删除区间[i,j-1];区间从0开始
vector<int>::iterator it;
it=vec.beging()+长度
vec.earse(it); 直接删除it
cout<<*it<<endl;
(8)向量大小:vec.size();
(9)清空:vec.clear();
可参考例题:TOJ 1218
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main()
{
vector<int> vec;
string s;
while (cin >> s)
{
if (s == "exit") break;
else if (s == "push")
{
int n;
cin >> n;
vec.push_back(n);
}
else if (s == "pop")
{
vector<int>::iterator it;
if (vec.size()>0)
{
it = vec.end() - 1;
cout << *it << endl;
vec.pop_back();
}
else
cout << "None" << endl;
}
else if (s == "top")
{
vector<int>::iterator it;
if (vec.size()>0)
{
it = vec.end() - 1;
cout << *it << endl;
}
else
cout << "None" << endl;
}
else if (s == "clear")
vec.clear();
}
return 0;
}
TOJ:1214
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main()
{
vector <int> v;
string s;
while (cin>>s)
{
if (s == "exit")break;
else if (s == "insert")
{
int n, x, y;
cin >> n;
while (n--)
{
cin >> x >> y;
v.insert(v.begin() + (x - 1), y);
}
}
else if (s == "delete")
{
int n;
cin >> n;
vector<int>::iterator it;
it = v.begin() + (n - 1);
cout << *it << endl;
v.erase(it);
}
else if (s == "getelem")
{
int n;
cin >> n;
cout << v[n - 1] << endl;
}
else if (s == "clear")
v.clear();
}
}
#include <iostream>
#include <vector>
#include <math.h>
#include <algorithm>
using namespace std;
bool cmp(int x, int y)
{
return fabs(double(x))> fabs(double(y));
}
int main()
{
int n,i;
while (cin >> n)
{
vector<int>v;
if (n == 0)break;
for (i = 0; i < n; i++)
{
int a;
cin >> a;
v.push_back(a);
}
sort(v.begin(), v.end(), cmp);
vector<int>::iterator it;
for (it = v.begin(); it != v.end()-1; it++)
cout << *it<<" ";
cout << *it << endl;
}
}
2. deque
使用大致与vector相同,只是头文件改为了#include<deque>.创建对象改为了deque<int>vec;
主要区别在于他们的底层实现不同,特别是插入和删除操作的实现机制不同。
对于vector来说,不管其大小是多少,在头部插入的效率总是比在尾部插入的效率要低。在尾部插入将耗费固定的时间。在头部进行插入时,耗费的之间与vector的大小成正比,vector越大,耗费时间越多。
对于deque来说,不管进行的是插入还是删除操作,也不管这些操作是子啊头部还是尾部进行,算法的效率将是固定的。
因此对于需要在两端进行插入和删除操作的情况,deque要优于vector。
3. list
vector和deque都重载了运算符[],而list没有。
list成员 | 说明 |
constructor | 构造函数 |
destructor | 析构函数 |
operator= | 赋值重载运算符 |
assign | 分配值 |
front | 返回第一个元素的引用 |
back | 返回最后一元素的引用 |
begin | 返回第一个元素的指针(iterator) |
end | 返回最后一个元素的下一位置的指针 |
rbegin | 返回链表最后一元素的后向指针(reverse_iterator or const) |
rend | 返回链表第一元素的下一位置的后向指针 |
push_back | 增加一元素到链表尾 |
push_front | 增加一元素到链表头 |
pop_back | pop_back()删除链表尾的一个元素 |
pop_front | 删除链表头的一元素 |
clear | 删除所有元素 |
erase | 删除一个元素或一个区域的元素(两个重载) |
remove | 删除链表中匹配值的元素(匹配元素全部删除) |
remove_if | 删除条件满足的元素(遍历一次链表),参数为自定义的回调函数 |
empty | 判断是否链表为空 |
max_size | 返回链表最大可能长度 |
size | 返回链表中元素个数 |
resize | 重新定义链表长度(两重载函数) |
reverse | 反转链表 |
sort | 对链表排序,默认升序 |
merge | 合并两个有序链表并使之有序 |
splice | 对两个链表进行结合(三个重载函数) 结合后第二个链表清空 |
insert | 在指定位置插入一个或多个元素(三个重载函数) |
swap | 交换两个链表(两个重载) |
unique | 删除相邻重复元素 |