STL和基本数据结构

STL和基本数据结构

STL容器

  • vector
  • 队列
  • 链表
  • set
  • map

sort函数

next_permutation函数

STL:C++标准模板库(Standard Template Library)

  • 常用的数据结构、算法
  • 能极大地简化编程。

 容器

  • 顺序式容器:vector,list,deque,queue,priority_queue,stack等

  • 关联式容器:set,multiset,map,multimap等

 

vector

  • 数组:算法竞赛中,为避免出错,一般用静态数组,
  • 能开多大就开多大:int a[1000000], dp[1000000];
  •  
  • 如果空间紧张,用STL的vector建立动态数组,不易出错。

 Vector:

  • 动态数组,运行时根据需要改变数组大小。
  • 以数组形式存储,内存空间是连续的,索引可以在常数时间内完成。
  • 但是在中间进行插入和删除操作,会造成内存块的拷贝。

vector容器能存放任何类型的对象:

功能

例子

说明

定义int型数组

vector<int> a;

默认初始化,a为空

vector<int> b(a);

用a定义b

vector<int> a(100);

a有100个值为0的元素

vector<int> a(100, 6);

100个值为6的元素

定义string型数组

vector<string> a(10,”null”);

10个值为null的元素

vector<string> vec(10,”hello”);

10个值为hello的元素

vector<string>b(a.begin(), a.end()); 

b是a的复制

定义结构型数组

struct point { int x, y;};

vector<point> a;

a用来存坐标


定义多维数组,例如定义一个二维数组:  多维数组

  • vector<int> a[MAXN];
  • 它的第一维大小是固定的MAXN,第二维是动态的。
  • 用这个方式,可以实现图的邻接表存储。

vector各种属性

功能

例子

说明

赋值

a.push_back(100); 

在尾部添加元素

元素个数

int size = a.size();

元素个数

是否为空

bool isEmpty = a.empty();

判断是否为空

打印

cout<<a[0]<<endl; 

打印第一个元素

中间插入

a.insert(a.begin()+i, k);

在第i个元素前面插入k

尾部插入

a.push_back(8);

尾部插入值为8的元素

尾部插入

a.insert(a.end(), 10,5);

尾部插入10个值为5的元素

删除尾部

a.pop_back(); 

删除末尾元素

删除区间

a.erase(a.begin()+i, a.begin()+j);

删除区间[i, j-1]的元素

删除元素

a.erase(a.begin()+2);

删除第3个元素

调整大小

a.resize(n)

数组大小变为n

清空

a.clear();                

 

翻转

reverse(a.begin(), a.end());

用函数reverse翻转数组

排序

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

用函数sort排序,从小到大

例:hdu 4841圆桌问题

  • 圆桌上围坐着2n个人。其中n个人是好人,另外n个人是坏人。从第一个人开始数数,数到第m个人,立即赶走该人;
  • 然后从被赶走的人之后开始数数,再将数到的第m个人赶走……依此方法不断赶走围坐在圆桌上的人。
  • 预先应如何安排这些好人与坏人的座位,能使得在赶走n个人之后,圆桌上围坐的剩余的n个人全是好人?
#include<bits/stdc++.h>
using namespace std;
int main()
{
    vector <int> table;                          //模拟圆桌
    int n, m;
    while(cin >> n >> m)
    {
        table.clear();
        for(int i=0; i<2*n; i++)  table.push_back(i);  //初始化
        int pos = 0;                               //记录当前位置
        for(int i=0; i<n; i++)                   //赶走n个
        {
            pos = (pos+m-1) % table.size();    //圆桌是个环,取余处理
            table.erase(table.begin() + pos); //赶走坏人,table人数减1
        }
        int j = 0;
        for(int i=0; i<2*n; i++)                //打印预先安排座位
        {
            if(!(i%50) && i)  cout<<endl;       //50个字母一行
            if(j<table.size() && i==table[j])  //table留下的都是好人
            {
                j++;
                cout<<"G";
            }
            else
                cout<<"B";
        }
        cout<<endl<<endl;                          //留一个空行
    }
    return 0;
}

 

 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值