vector刘汝佳算法入门学习笔记


//*****-*-----vector***///////

常用操作封装,a.size();可以读取大小
              a.resize();可以改变大小;
              a.push_back();可以向尾部添加元素;
    因为是个模板类
    声明:
            vector<int>a;vector<int>是一个类似于int a[];的整数数组;
            vector<int>b;
            vector<string>是类似于string a[]的字符串数组;
    vector 看上去像一个一等公民,因为他们可以直接赋值,还可以作为函数的参数或者返回值,
           而无须像数组那样另外用一个变量来指定元素个数。
   
    /*****------UVA101的木块问题------********/
   
    从左到右有n个木块,编号为0~n-1,要模拟四种操作;
   
    move a onto b:把a和b上方的木块全部归为,然后把a摞在b上面。
    move a over b:把a上面的全部归位,然后把a放下b所在木块堆的顶部。
    pile a onto b:把b上方的木块全部归位,然后把a及上面的木块整体摞在b上面。
    pile a over b:把a及上面的木块整体摞在b所在木块的顶部。

#include<cstdio>
#include<string>
#include<vector>
#include<iostream>
using namespace std;

const int maxn=30;

int n;
vector<int> pile[maxn];

//找木块a所在的pile和height,以引用的形式返回调用者;
void find_block(int a,int &p. int &n)
{
    for(int p=0;p<n;p++)
    {
        for(int h=0;h<pile;p++)
        {
            if(pile[p][h]==a)
                return;
        }
    }
}


//*****--------把p堆上的所有元素都放回原处***-----*/
void clear_above(int p,int h)
{
    for(int i=h+1;i<pile[p].size();i++)
    {
        int b=pile[p][i];
        pile[b].push_back(b);
    }
    pile[p].resize(h+1);//保留0~h的元素
}

//把p堆高度为h及其上方的木块整体放到p2堆的顶部;

void pile_onto(int p,int p2,int h)
{
    for(int i=h;i<pile[p].size();i++)
    {
        pile[p2].push_back(pile[p][i]);
    }
    pile[p].resize(h);
}

和数组相比的话:
 【优点】
 安全,不会不小心越界
 可以利用标准库的很多功能,包括现成的成员函数和一些泛化算法
 【缺点】
 使用迭代器必须要小心


 VECTOR 在频繁的插入和删除 效率比较低
  特别如果是大型的对象会增加很多的析构和拷贝
  小型的对象和内置数据类型VECTOR 效率还是比较高的
  所以如果是小型的对象和内置数据类型 可以用VECTOR 比LIST效率高
  除非你有非常频繁的删除插入


             
             

 
原文地址:https://www.cnblogs.com/keyboarder-zsq/p/5934560.html