本篇将以我个人的理解概述STL容器中的顺序式容器vector。
vector是一种动态数组,属于顺序式容器,可以从末尾快速插入与删除,并且可以直接访问任何元素,但是在序列中间岁间的插入,删除元素要慢,相对list容器来说vector拥有更快访问随机元素的能力,但是随机插入元素不如list。
需要添加头文件vector
vector的创建操作如下:
vector< 类型> 变量名(数量,初始值);
如:
vector<int> a(10); //定义十个int类型变量
vector<string> b(k); //定义k个string型变量
vector<int> a(10,5); //定义10个值为5的变量
vector<string> b{"hello","world"} //定义两个分别为hello和world的string变量
vector<int> b(a.begin(),a.end()); //将a复制到b中
基本操作:
a.push_back(i); //在尾部添加元素i
int size = a.size(); //返回元素个数
a.insert(a.begin()+i,k); //在第i个元素前插入k
a.insert(a.end(),i,k); //在尾部添加i个k
a.pop_back(); //删除尾部元素
a.erase(a.begin() + i,a.begin() + j); //删除i到j区间的元素
a.resize(n); //将vector大小变为n
a.clear(); //清空**
vector可以使用sort函数排序,用法为sort(a.begin(),a.end())
PS:
逐个输出容器元素时可以使用
for(auto it = a.begin();it != a.end();it++)
cout<<*it<<endl;
在早期C/C++中auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量
C++98中的auto多余且极少使用,C++11已经删除了这一用法,取而代之的是全新的auto:变量的自动类型推断。
C++11中,标准委员会赋予了auto全新的含义即:auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。
如果没有auto的话操作将会很麻烦
std::vector<std::string> vs;
for (std::vector<std::string>::iterator i = vs.begin(); i != vs.end(); i++)
{
//...
}
但是使用auto便可以简化不少
std::vector<std::string> vs;
for (auto i = vs.begin(); i != vs.end(); i++)
{
//..
}
for循环中的i将在编译时自动推导其类型,而不用我们显式去定义那长长的一串。
用法示例
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
Source
AHOI1999
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n, m;
vector<int> table;//以vector模拟圆桌
while (cin >> n >> m)
{
table.clear();//需要每轮清空一下容器,否则一轮过后就会出错
for (int i = 0; i < n * 2; i++)
table.push_back(i);//初始化圆桌
int pos = 0;//记录位置
for (int i = 0; i < n; i++)
{
pos = (pos + m - 1) % table.size();//取余桌位大小,过头的话得从第一位来
table.erase(table.begin() + pos);//抹除坏人
}
int j = 0;
for (int i = 0; i < n * 2; i++)
{
if (!(i % 50) && i)
cout << endl;//题目要求
if (j < table.size() && i == table[j])//将模拟一轮之后的好人比对位置进行输出
{
j++;
cout << 'G';
}
else
cout << 'B';
}
cout << endl;
}
return 0;
}