一.vector容器

① 动态数组,从末尾能快速插入与删除,直接访问任何元素。
② 一个摸板类,能存放任何类型的对象。
③ Vector作为函数的参数或者返回值时,需要注意它的写法:
double Distance(vector<int>&a, vector<int>&b) 其中的 “&” 绝对不能少!

</int></int>

二.vector的基本操作

(1)创建vector对象,vector<int> vec;</int>

(2)尾部插入数字:vec.push_back(a);

(3)使用下标访问元素,cout<<vec[0]<<endl;

(4)使用迭代器访问元素.

vector<int>::iterator it;

for (it = vec.begin(); it != vec.end(); it++)
    cout << *it << endl;

(5)插入元素: vec.insert(vec.begin()+i, a); //在第i+1个元素前面插入a;

(6)删除元素: vec.erase(vec.begin()+2); //删除第3个元素
vec.erase(vec.begin()+i,vec.end()+j); //删除区间[i,j-1];区间从0开始

(7)向量大小:vec.size();

(8)清空:vec.clear();

(9)使用reverse将元素翻转:
reverse(vec.begin(),vec.end());//将元素翻转,即逆序排列!

(10)使用sort排序:
sort(vec.begin(), vec.end());(默认是按升序排列,即从小到大).

可以通过重写排序比较函数按照降序比较,如下:

bool cmp(const int &a, const int &b) {
    return a > b;
}
sort(vec.begin(), vec.end(), cmp)

三.vector应用

HDOJ4841-圆桌问题

Problem Description
圆桌上围坐着2n个人。其中n个人是好人,另外n个人是坏人。如果从第一个人开始数数,数到第m个人,则立即处死该人;然后从被处死的人之后开始数数,再将数到的第m个人处死……依此方法不断处死围坐在圆桌上的人。试问预先应如何安排这些好人与坏人的座位,能使得在处死n个人之后,圆桌上围坐的剩余的n个人全是好人。

Input
多组数据,每组数据输入:好人和坏人的人数n(<=32767)、步长m(<=32767);

Output
对于每一组数据,输出2n个大写字母,‘G’表示好人,‘B’表示坏人,50个字母为一行,
不允许出现空白字符。相邻数据间留有一空行。

Sample Input

2 3
2 4

Sample Output

GBBG

BGGB

是一个典型的约瑟夫环问题,在这里vector可模拟圆桌,算法思想是让vector只存储好人的编号,不在vector内的编号则全为坏人。

#include<bits/stdc++.h>
#define fio ios::sync_with_stdio(false);cin.tie(0);
using namespace std;
int main() {
  vector<int> a;
  int n, m;
  while (~scanf("%d%d", &n, &m)) {
    a.clear();
    for (int i = 0; i < 2*n; i++) {//初始化 
      a.push_back(i);
    }
    int temp = 0;//记录当前位置 
    for (int i = 0; i < n; i++) {//踢出n个人 
      temp = (temp+m-1)%a.size();//圆桌是个环,取余处理 
      a.erase(a.begin() + temp);//赶走坏人,size-1 
    }
    int count = 0;
    for (int i = 0; i < 2*n; i++) {//打印座位 
      if ((i%50 == 0) && i) cout << endl;//遇到50换行 
      if (count < a.size() && a[count] == i) {//vector存的都是好人,将size个元素全部输出后,剩余皆为坏人 
        cout << "G";
        count++;
      } else {
        cout << "B";
      }
    }
    cout << endl << endl;//留空行处理 
  }
}