ACM竞赛常用STL(一)1

简介: s.resize(n, val)改变序列的长度,超出的元素将会被删除,如果序列需要扩展(原空间小于n),将用val 填满扩展出的空间。

全排列函数next_permutation

STL 中专门用于排列的函数(可以处理存在重复数据集的排列问题)


头文件:#include <algorithm>


using namespace std;


调用: next_permutation(start, end);


注意:函数要求输入的是一个升序排列的序列的头指针和尾指针.


用法:



// 数组

int a[N];

sort(a, a+N);

next_permutation(a, a+N);

// 向量

vector<int> ivec;

sort(ivec.begin(), ivec.end());

next_permutation(ivec.begin(), ivec.end());

例子:

vector<int> myVec;

// 初始化代码

sort(myVec.begin(),myVec.end());

do{

   for (i = 0 ;i < size;i ++ ) cout << myVec[i] << " \t " ;

   cout << endl;

}while (next_permutation(myVec.begin(), myVec.end()));



ACM/ICPC 竞赛之STL--pair

STL 的<utility>头文件中描述了一个看上去非常简单的模板类pair,用来表示一个二元组或元素对,并提供了按照字典序对元素对进行大小比较的比较运算符模板函数。


例如,想要定义一个对象表示一个平面坐标点,则可以:


pair<double, double> p1;cin >> p1.first >> p1.second;pair 模板类需要两个参数:首元素的数据类型和尾元素的数据类型。pair 模板类对象有两个成员:first 和second,分别表示首元素和尾元素。


在<utility>中已经定义了pair 上的六个比较运算符:<、>、<=、>=、==、!=,其规则是先比较first,first 相等时再比较second,这符合大多数应用的逻辑。当然,也可以通过重载这几个运算符来重新指定自己的比较逻辑。除了直接定义一个pair 对象外,如果需要即时生成一个pair 对象,也可以调用在<utility>中定义的一个模板函数:make_pair。make_pair 需要两个参数,分别为元素对的首元素和尾元素。


在题1067--Ugly Numbers 中,就可以用pair 来表示推演树上的结点,用first 表示结点的值,用second 表示结点是由父结点乘以哪一个因子得到的。


#include <iostream>

#include <queue>

using namespace std;

typedef pair<unsigned long, int> node_type;

int main()

{

   unsigned long result[1500];

   priority_queue< node_type, vector<node_type>,

   greater<node_type> > Q;

   Q.push( make_pair(1, 2) );

   for (int i=0; i<1500; i++)

   {

       node_type node = Q.top(); Q.pop();

       switch(node.second)

       {

           case 2: Q.push( make_pair(node.first*2, 2) );

           case 3: Q.push( make_pair(node.first*3, 3) );

           case 5: Q.push( make_pair(node.first*5, 5) );

       }

       result[i] = node.first;

   }

   int n;

   cin >> n;

   while (n>0)

   {

       cout << result[n-1] << endl;

       cin >> n;

   }

   return 0;

}



ACM/ICPC 竞赛之STL--vector

在STL 的<vector>头文件中定义了vector(向量容器模板类),vector容器以连续数组的方式存储元素序列,可以将vector 看作是以顺序结构实现的线性表。当我们在程序中需要使用动态数组时,vector 将会是理想的选择,vector 可以在使用过程中动态地增长存储空间。


vector 模板类需要两个模板参数,第一个参数是存储元素的数据类型,第二个参数是存储分配器的类型,其中第二个参数是可选的,如果不给出第二个参数,将使用默认的分配器。


下面给出几个常用的定义vector 向量对象的方法示例:38


vector<int> s;


定义一个空的vector 对象,存储的是int 类型的元素。


vector<int> s(n);定义一个含有n 个int 元素的vector 对象。


vector<int> s(first, last);定义一个vector 对象,并从由迭代器first 和last 定义的序列[first,last)中复制初值。


vector 的基本操作有:


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, x) 向迭代器it 指向的元素前插入新元素val。


s.insert(it, n, x)向迭代器it 指向的元素前插入n 个x。


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 对象v 进行交换。


s.assign(first, last)将序列替换成由迭代器first 和last 所指定的序列[first, last)。[first, last)不能是原序列中的一部分。要注意的是,resize 操作和clear 操作都是对表的有效元素进行的操作,但并不一定会改变缓冲空间的大小。另外,vector 还有其他一些操作如反转、取反等,不再一下列举。vector 上还定义了序列之间的比较操作运算符(>, <, >=, <=, ==, !=),


可以按照字典序比较两个序列。还是来看一些示例代码。输入个数不定的一组整数,再将这组整数按倒序输出,


如下所示:


#include <iostream>
#include <vector>
using namespace std;
int main()
{
    vector<int> L;
    int x;
    while (cin>>x) L.push_back(x);
    for (int i=L.size()-1; i>=0; i--) 
        cout << L[i] << " ";
    cout << endl;
    return 0;
}
目录
相关文章
|
11月前
|
算法 C++ 容器
ACM竞赛常用STL(一)2
ACM/ICPC 竞赛之STL--iterator 简介 iterator(迭代器)是用于访问容器中元素的指示器,从这个意义上说,iterator(迭代器)相当于数据结构中所说的“遍历指针”,也可以把iterator(迭代器)看作是一种泛化的指针。STL 中关于iterator(迭代器)的实现是相当复杂的,这里我们暂时不去详细讨论关于iterator(迭代器)的实现和使用,而只对iterator(迭代器)做一点简单的介绍。
41 0
|
11月前
|
C++ 容器
ACM竞赛常用STL(二)之STL--algorithm
内部实现: 数组 // 就是没有固定大小的数组,vector 直接翻译是向量vector // T 就是数据类型,Alloc 是关于内存的一个什么东西,一般是使用默认参数。
42 0
|
Java C语言 C++
ACM刷题之路(二)谈谈我对ACM的理解
ACM刷题之路(二)谈谈我对ACM的理解
|
Java Android开发
ACM刷题之路(七)字符串处理 记元培ACM院赛
ACM刷题之路(七)字符串处理 记元培ACM院赛
|
机器学习/深度学习 人工智能 算法
295页博士论文探索强化学习抽象理论,获AAAI/ACM SIGAI博士论文奖提名
295页博士论文探索强化学习抽象理论,获AAAI/ACM SIGAI博士论文奖提名
113 0
|
机器学习/深度学习 算法
ACM 选手带你玩转递归算法!
ACM 选手带你玩转递归算法!
ACM 选手带你玩转递归算法!
|
算法 搜索推荐
ACM 选手带你玩转分治算法!
ACM 选手带你玩转分治算法!
ACM 选手带你玩转分治算法!
|
算法 编译器 C++
ACM - 基础篇(上)
ACM - 基础篇(上)
184 0
|
测试技术 C语言
ACM - 基础篇(下)
ACM - 基础篇(下)
187 0