【vector】
一个vector类似一个动态的一维数组。
vector中可以存在重复的元素。
vector <数据类型> a;
vector <int> a(100,0) //声明了一个已经存放了100个0的整型vector
头文件:#include<vector>
【常用函数】
1.a.size() //返回元素个数
2.a.push_back() //在末尾压入元素
3.a.pop_back() //删除最后一个元素
4.a.back() //返回最后一个元素
5.a.clear() //清空vector
6.a.empty() //判断是否为空
7.a.begin() //得到数组头的指针
8.a.end() //得到数组最后一个单元的引用
9.a.erase() //删除指针指向的数据项
10.a.swap() //与另一个vector交换数据
【简单应用】
Morning_X的小学数学
TimeLimit:2000MS MemoryLimit:256MB
64-bit integer IO format:%I64d
Problem Description
Morning_X已经11岁了,今天是他上小学五年级的日子,在数学课上,老师讲解到了约数的内容。因为Morning_X喜欢装13,所以他在数学课上公然挑衅老师说,老师只要给他一个数n和一个数k,他就能按从小到大算出n的第K个约数。
但是其实Morning_X脑子没转的那么快,所以他偷偷的请求了脑袋灵敏的ACMer来帮助他,请大家快帮帮Morning_X吧!
Input
每一个测试数据包括一个n和一个k(1 ≤ n ≤ 1015, 1 ≤ k ≤ 109).
Output
如果n没有第K个约数则输出-1,如果有则输出第K个约数
SampleInput 1
4 2
SampleOutput 1
2
SampleInput 2
5 3
SampleOutput 2
-1
SampleInput 3
12 5
SampleOutput 3
6
Note 第一个样例:4有三个约数分别为1,2,4,则第二个约数为2 第二个样例:5只有两个约数分别为1,5,第三个约数不存在所以输出-1;
【代码】
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
main()
{
ll n,k,i;
vector <ll> a;
while(cin>>n>>k)
{
a.clear();
for(i=1;i<=sqrt(n);i++)
{
if(n%i==0)
{
a.push_back(i);
if(i*i!=n)
a.push_back(n/i);
}
}
sort(a.begin(),a.end());
if(k>a.size())
cout<<"-1\n";
else
cout<<a[k-1]<<endl;
}
}
【map】
map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它在我们处理一对一数据的时候,在编程上提供快速通道。map内部自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能。
下面举例说明什么是一对一的数据映射。比如一个班级中,每个学生的学号跟他的姓名就存在着一一映射的关系,这个模型用map可以轻易描述,很明显学号用int描述,姓名用字符串描述。
【数据的插入】
1.mapStudent.insert(pair<int, string>(1, "student_one"));
2.mapStudent.insert(map<int, string>::value_type (1, "student_one"));
3.mapStudent[1] = "student_one";
【数据的查找】
第一种:用count函数来判定关键字是否出现,其缺点是无法定位数据出现位置,由于map的特性,一对一的映射关系,就决定了count函数的返回值只有两个,要么是0,要么是1,如果出现就返回1。
第二种:用find函数来定位数据出现位置,它返回的一个迭代器,当数据出现时,它返回数据所在位置的迭代器,如果map中没有要查找的数据,它返回的迭代器等于end函数返回的迭代器。
第三种:
Lower_bound函数用法,这个函数用来返回要查找关键字的下界(返回>=的第一个数据)
Upper_bound函数用法,这个函数用来返回要查找关键字的上界(返回>的第一个数据)
例如:map中已经插入了1,2,3,4的话,如果lower_bound(2)的话,返回的2,而upper-bound(2)的话,返回的就是3
Equal_range函数返回一个pair,pair里面第一个变量是Lower_bound返回的迭代器,pair里面第二个迭代器是Upper_bound返回的迭代器,如果这两个迭代器相等的话,则说明map中不出现这个关键字。
【数据的清空与判空】
清空map中的数据可以用clear()函数,判定map中是否有数据可以用empty()函数,它返回true则说明为空。
【数据的删除】
这里要用到erase函数,它有三个重载了的函数,下面在例子中详细说明它们的用法。
#include <map>
#include <string>
#include <iostream>
using namespace std;
int main()
{
map <int,string> mp;
mp.insert(pair <int,string> (1, "student_one"));
mp.insert(pair <int,string> (2, "student_two"));
mp.insert(pair <int,string> (3, "student_three"));
map<int, string>::iterator iter;
iter = mp.find(1);
mp.erase(iter); //用迭代器删除
mp.erase(1); //用关键字删除
mp.erase(mp.begin(), mp.end()); //删除区间是一个前闭后开的集合
}
【set】
set中不会包含重复的元素。
set的含义是集合,是一个有序的容器,支持插入、删除、查找等操作,效率非常高。
set <int> a;
【基本操作】
a.begin() //返回set容器的第一个元素
a.end() //返回set容器的最后一个元素
a.clear() //删除set容器中的所有的元素
a.empty() //判断set容器是否为空
a.insert() //在集合中插入元素
a.count() //返回某个值元素的个数
a.max_size() //返回set容器可能包含的元素最大个数
a.size() //返回当前set容器中的元素个数
a.find() //若找到则返回给定值位置,若没有找到就返回a.end()
a.erase() //删除指针指向的数据项
and so on...是不是有点越写越随便了...反正都差不多用法...问题不大