ACM 学习总结报告(一)

STL 容器
STL容器允许我们重复利用已有的实现构造自己的特定类型下的数据结构,通过设置一些模版类,STL容器对最常用的数据结构提供了支持,这些模板的参数允许我们指定容器中元素的数据类型,可以将我们许多重复而乏味的工作简化。

寒假看着题目却无从下手,其实还是没搞明白容器是怎么一回事儿。现在经过两周的学习或多或少都对STL有了些理解,但面对繁琐的知识,总是不知道该如何使用(其实还是不熟练罢了),所以下面进行了一些知识点总结。有些知识点已经在程序后面标注了,所以没有单独列出来。
一:栈 (Stack)
stack是一种先进后出(First In Last Out, FILO)的数据结构,它只有一个出口,只能操作最顶端元素。
头文件: #include
定义:stack<data_type> stack_name;
如:stack s;
基本操作:

s.push(x);//入栈
s.pop();//出栈
s.top();//访问栈顶
s.empty();//当栈空时,返回true
s.size();//访问栈中元素个数

二:队列(queue)
queue是一种先进先出(First In First Out, FIFO)的数据结构,从底端加入元素,从顶端取出元素
头文件: #include
定义:queue <data_type> queue_name;
如:queue q;
基本操作:

q.push(x);//入队列
q.pop(); //出队列
q.front();//访问队首元素
q.back(); //访问队尾元素
q.empty();//判断队列是否为空
q.size();//访问队列中的元素个数

三:动态数组(vector)
头文件: #include
定义:vector <data_type> vector_name;
如:vector v;
基本操作:

s[i]//直接以下标方式访问容器中的元素
s.front()//返回首元素
s.back()//返回尾元素
s.push_back(x)//向表尾插入元素x
s.size()//返回表长
s.empty()//表为空时,返回真,否则返回假
s.pop_back()//删除表尾元素
s.begin()//返回指向首元素的随机存取迭代器
s.end()//返回指向尾元素的下一个位置的随机存取迭代器
s.insert(it, val)//向迭代器it指向的元素前插入新元素val
s.insert(it, n, val)//向迭代器it指向的元素前插入n个新元素val
s.insert(it, first, last)   
//  将由迭代器first和last所指定的序列[first, last)插入到迭代器it指向的元素前面
s.erase(it)//删除由迭代器it所指向的元素
s.erase(first, last)//删除由迭代器first和last所指定的序列[first, last)
s.reserve(n)//预分配缓冲空间,使存储空间至少可容纳n个元素
s.resize(n)//改变序列长度,超出的元素将会全部被删除,如果序列需要扩展(原空间小于n),元素默认值将填满扩展出的空间
s.resize(n, val)//改变序列长度,超出的元素将会全部被删除,如果序列需要扩展(原空间小于n),val将填满扩展出的空间
s.clear()//删除容器中的所有元素
s.swap(v)//将s与另一个vector对象进行交换

四:排序(sort)
头文件: #include
sort(begin, end);
sort(begin, end, cmp);
例:

int num[] = {1,5,6,2,9};
	
	1) sort(num, num + 5);//默认从小到大排序num[] = {1,2,5,6,9};
	2) bool cmp(int a, int b)
       {
		return a > b;
	  }
	sort(num, num + 5, cmp); //num[] = {9,6,5,2,1};

五:生成排列
头文件: #include
bool next_permutation(begin, end);
改变区间内元素的顺序,产生下一个排列。
bool prev_permutation(begin, end);
产生前一个排列。
end为最后一个元素的下一个位置。
六:upper_bound 和 lower_bound
upper_bound(begin, end, value);
返回>value的元素的第一个位置。
lower_bound(begin, end, value);
返回>=value的元素的第一个位置。
七:set 和 multiset
set 和 multiset会根据特定的排序准则,自动将元素排序,两者的不同之处在于multiset可以允许元素重复而set不允许元素重复。
头文件: #include
定义:set <data_type> set_name;
如:set s;//默认由小到大排序
如果想按照自己的方式排序,可以重载小于号。

struct new_type
{
	int x, y;
	bool operator < (const new_type &a)const
	{
		if(x != a.x) return x < a.x;
		return y < a.y;
	}
}
set <new_type> s;

基本操作:

s.begin()//返回指向第一个元素的迭代器
s.clear()//清除所有元素
s.count()//返回某个值元素的个数
s.empty()//如果集合为空,返回true(真)
s.end()//返回指向最后一个元素之后的迭代器,不是最后一个元素
s.erase()//删除集合中的元素
s.find()//返回一个指向被查找到元素的迭代器
s.insert()//在集合中插入元素
s.lower_bound()//返回指向大于(或等于)某值的第一个元素的迭代器
s.size()//集合中元素的数目
s.swap()//交换两个集合变量
s.upper_bound()//返回大于某个值元素的迭代器

八:map和multimap
所有元素都会根据元素的键值自动排序,map的所有元素都是pair,pair的第一个元素被视为键值,第二个元素为实值。map不允许两个元素有相同的键值,但multimap可以。
头文件: #include
定义:map <data_type1, data_type2> map_name;
如:map <string, int> m;//默认按string由小到大排序
基本操作

m.size();//返回元素个数
m.empty();//判断是否为空
m.clear();//清空所有元素 
m.erase(key); //删除与指定key键值相匹配的元素对,并返回被删除的元素的个数。
m.erase(it);//删除由迭代器it所指定的元素对,并返回指向下一个元素对的迭代器。

九:优先队列(priority_queue)
一个拥有权值观念的queue,自动依照元素的权值排列,权值最高排在前面。缺省情况下,priority_queue是利用一个max_heap完成的
头文件: #include
定义:priority_queue <data_type> priority_queue_name;
如:priority_queue q;//默认是大顶堆
priority_queue<int, vector, greater > qqq;//定义小的先出队列
基本操作:

q.empty()//如果队列为空,则返回true,否则返回false
q.size()//返回队列中元素的个数
q.pop()//删除队首元素,但不返回其值
q.top()//返回具有最高优先级的元素值,但不删除该元素
q.push(item)//在基于优先级的适当位置插入新元素
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值