C++ STL专题1——Vector(不定长数组)

栏目: 编程工具 · 发布时间: 6年前

内容简介:Vector中文翻译为向量。在C++算法中,Vector存在于如果我们需要使用Vector,我们在头文件上首先要加上以下两条:我们如果需要定义一个名字为vec,类型为int的动态数组,即可在代码中这样写:
  • 什么是Vector?

Vector中文翻译为向量。在C++算法中,Vector存在于 C++标准模板库 ,也就是我们口中的 STL (Standard Template Library)。简单的讲,Vector是一个可以用来存放任意类型的动态数组,可以实现增加,压缩数据。Vector因为可以存放任意类型的对象,而也被比作一个 容器。

  • 如何使用Vector呢?

如果我们需要使用Vector,我们在头文件上首先要加上以下两条:

#include <vector>
using namespace std;

我们如果需要定义一个名字为vec,类型为int的动态数组,即可在代码中这样写:

vector<int> vec;
  • Vector中的一些简易的函数操作
  1.  vec.push_back(a) 在动态数组尾部添加数据a
  2.  vec.pop_back( ) 删除动态数组尾部的最后一个数据
  3.  vec.size( ) 查询动态数组此时存放了多少个元素
  4.  vec.empty( ) 查询动态数组此时是否为空,若为空则返回1,否则返回0
  5.  vec.clear( ) 清空整个动态数组
  6.  vec.front( ) 返回动态数组中的第一个元素
  7.  vec.resize(a) 重新定义动态数组的大小,即为只保存下标为0~a-1的元素
  8.  vec.erase(a) 删除a位置的数据,传回下一个数据的位置
  • UVA101 The Blocks Problem

题目链接: https://uva.onlinejudge.org/external/1/101.pdf

思路:对于四种操作,我们会发现有共同点。并且每个木块堆的高度是不确定的,所以我们使用Vector会十分方便。我们用一个动态数组名叫vec[MAXN],用来保存每一个木块堆的高度。

代码如下:

#include <cstdio>
#include <iostream>
#include <vector>
using namespace std;
int n,pa,pb,ha,hb,n1,n2;
string s1,s2;
vector<int> vec[30];//定义动态数组 
inline void find_block(int c,int& p,int& h)
{
  for(p=0;p<n;p++)
    for(h=0;h<vec[p].size();h++)
      if(vec[p][h]==c) return ; 
}
inline void back_above(int p,int h)//把第p堆高度为h的木块上方的所有木块放回原位 
{
  for(register int i=h+1;i<vec[p].size();i++)
  {
    int j=vec[p][i];
    vec[j].push_back(j);
  }
  vec[p].resize(h+1);//只保留下标0~h的元素 
}
inline void onto(int p1,int h,int p2)//把第p1堆高度为h及其以上的木块全部移到p2堆的顶部 
{
  for(register int i=h;i<vec[p1].size();i++)
  {
    int j=vec[p1][i];
    vec[p2].push_back(j);
  }
  vec[p1].resize(h);
}
int main()
{
  cin>>n;
  for(register int i=0;i<n;i++) vec[i].push_back(i);//开始时编号为i的木块都在第i个位置 
  while(cin>>s1>>n1>>s2>>n2)
  {
    find_block(n1,pa,ha);//找到木块n1所在的堆和高度,并且用引用的形式接受 
    find_block(n2,pb,hb);//找到木块n2所在的堆和高度,并且用引用的形式接受 
    if(pa==pb) continue;//非法指令 
    if(s2=="onto") back_above(pb,hb);//共同点1 
    if(s1=="move") back_above(pa,ha);//共同点2 
    onto(pa,ha,pb);//其他指令 
  }
  for(register int i=0;i<n;i++)
  {
    printf("%d:",i);
    for(register int j=0;j<vec[i].size();j++) printf(" %d",vec[i][j]);
    printf("\n");
  }
  return 0;
}
  • UVA10763 Foreign Exchange

题目链接: https://uva.onlinejudge.org/external/107/p10763.pdf

思路:这道题简单来说,本质上就是看看是否能两两配对,若出现一组或多组无法配对的情况则不满足条件。由于数据范围很大,所以直接使用邻接表的思路来存储是完全不行的。所以使用Vector是个很好的选择。在这道题中,我们会使用到一个叫find的函数。我们先来了解一下:

  • find( )

find存在于头文件 algorithm 中,同时需要加上 using namespace std

find( )的格式即为:find(起始位置,结束为止,查找的元素),也就是在一个指定的区间内寻找一个元素。在C++中规定,find( )返回的是要查找的元素第一次出现的位置;若未找到则返回end。函数返回的是迭代器或指针,即位置信息。所以若想保存这个位置,需要申请 迭代器 来保存下来。即:

vector<int>::iterator s=find(起始位置,结束为止,查找的元素);
  • 什么是迭代器

迭代器,是用于遍历一个数据集中的每个元素的东西。这些数据集可能是容器或者容器的子集。迭代器的主要优点是它们为任意类型的容器提供一个小巧并且通用(注意通用很重要)的接口。例如,迭代器接口的一个操作是让它依次遍历数据集的每个元素。这个操作是依赖容器的内总部结构独立完成的。迭代器之所以有效是因为容器类提供它自己的迭代器类型来做“正确的事”,容本身的迭代器了解容器的内部结构。迭代器的接口几乎相当于普通的指针。让一个迭代器递增只需调用++操作符。使用*操作符可以得到迭代器引用的数据值。因而迭代器可以被任为是一种智能指针。

代码如下:

#include <cstdio>
#include <iostream>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
vector<int> vec[500001];
int a,b,s,n,num;
int main()
{
  while(cin>>n&&n)
  {
    memset(vec,0,sizeof(vec));//多组数据,清空数组 
    num=0;
    for(register int i=0;i<n;i++)
    {
      cin>>a>>b;
      vector<int>::iterator s=find(vec[a].begin(),vec[a].end(),b);
      if(s!=vec[a].end())
      {
        num--;
        vec[a].erase(s);//若存在,则删除这个配对关系 
      }
      else
      {
        num++;
        vec[b].push_back(a);
      }
    }
    if(num) cout<<"NO"<<endl;//说明存在未配对成功的配对 
    else cout<<"YES"<<endl;
  }
  return 0;
}

参考与引用:

https://www.cnblogs.com/-Mr-y/p/7985987.html

https://blog.csdn.net/accelerator_/article/details/9983249

https://www.cnblogs.com/chenzhefan/p/5649429.html

https://blog.csdn.net/huangyimin/article/details/6133650

本人喜爱诗句分享赏析:

  • 曾经沧海难为水,除却巫山不是云。——元稹《离思五首·其四》

元稹巧妙地使用了孟子的典故: 观于海者难为水 和神话传说 巫山云雨 ,表达了对亡妻韦丛的追悼。现今也用来比喻对于心上人的山盟海誓,表达自己对爱情的忠贞。


以上所述就是小编给大家介绍的《C++ STL专题1——Vector(不定长数组)》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

自制编译器

自制编译器

[日] 青木峰郎 / 严圣逸、绝云 / 人民邮电出版社 / 2016-6 / 99.00元

本书将带领读者从头开始制作一门语言的编译器。笔者特意为本书设计了CЬ语言,CЬ可以说是C语言的子集,实现了包括指针运算等在内的C语言的主要部分。本书所实现的编译器就是C Ь语言的编译器, 是实实在在的编译器,而非有诸多限制的玩具。另外,除编译器之外,本书对以编译器为中心的编程语言的运行环境,即编译器、汇编器、链接器、硬件、运行时环境等都有所提及,介绍了程序运行的所有环节。一起来看看 《自制编译器》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具