容器—vector的基本用法以及实践

本篇将以我个人的理解概述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;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值