STL模板总结归纳(vector,deque和list)

好久没有更博呀都快一个月了呢~最近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();
	}
}

TOJ:1090
#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 

删除相邻重复元素 

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值