STL 之 vector map set

【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...是不是有点越写越随便了...反正都差不多用法...问题不大

 

猜你喜欢

转载自blog.csdn.net/qq_41117236/article/details/81109275