C++中数据结构 Vector的用法总结

10 篇文章 0 订阅
3 篇文章 0 订阅

作为初学者,为vector做一些浅显、简洁的总结;

1 定义:

vector, 可以封装各种数据类型(数值、字符、布尔或vector本身)的动态可变的顺序容器。
显然三个优点,

  • 1)顺序存储便于遍历访问;
  • 2)可以封装各种类型,比数组要灵活的多;
  • 3)动态数组:不像数组,可以扩容(一般都是初定一个容量、达到70%容量自动触发扩容机制)。

C++容器 新建、遍历、排序、二维vector、判空

操作示例
新建- vector vi; 创建空vector,最常用;
Vectorvi (int nSize);
Vectorvi (int, const int);
Int ai[]={0,1,2,3,4}, Vectorvi(& a[1], & a[4]); 建立一个vector,元素从另外一个数组中复制[begin,end) 部分,注意两个参量均是引用类型;
遍历顺序访问:int ai[]={10,11,12,13,14,15, 16,17,18,19}; // vector<int> vi(&ai[2],&ai[9]); // for(int i=0; i<vi.size(); i++){cout<<vi[i]<<","; }
模仿stack压入 vi.push_back(int) 顶上弹出(注意不会输出值): // vi.pop_back(int)
判空vi.empty();// 空则输出1, 否则输出0;
排序sort(vi.begin(),vi.end());//升序;
降序排序bool compare(int a,int b) return a> b; sort(vi.begin(),vi.end(),compare)通过自定义比较器compare;

二维: 新建、输出:都相当于2维数组,组层构建即可;

vector<vector<int> > vi2D;
   int ai[]={0,1,2,3,4};
   vector<int> vi(&ai[0],&ai[5]);
   
   for(int i=0; i<2;i++){
       vi2D.push_back(vi);
   }

   for(int i=0;i<vi2D.size();i++)
   {
       for(int j=0;j<vi2D[i].size();j++)
       cout<<vi2D[i][j]<<",";
       cout<<endl;
   }

迭代器:

一维:

vector<int>::iterator p;
    for(p = vi.begin(); p < vi.end(); p++){
        cout<<*p<<",";
    }

(注意,所有类型的一维迭代器都是一样的。一通百通,只需要修改vector中封装类型即可)

二维

    vector<int >::iterator it;
    for(int i=0;i<vi2D.size();i++)
    {
        for(it=vi2D[i].begin();it<vi2D[i].end();it++)
        cout<<*it<<",";
        cout<<endl;
    }

迭代器:

顺序容器很重要的思想,所有的顺序容器(如string)都可以用iterator以相似的语句实现

定义方法为vector:: iterator it; 看起来复杂,其实类似于for循环中,我们定义的局域int i = 0;那个 指示器。这里迭代器其实是个引用,故没有类型区分(引用跨的间隔取决于vector中所定义的类型);

示例

1降序排序:

#include <iostream>
#include <vector>
#include<string.h>
#include<algorithm>
using namespace std;

bool compare(int a,int b){
    return a>b;
}

int main() {
    int ai[]={10,11,12,13,14,15,16,17,18,19};
    vector<int> vi(&ai[2],&ai[9]);
    
    for(int i=0; i<5; i++){
       vi.push_back(i);
    }
   
     for(int i=0; i<vi.size(); i++){
        cout<<vi[i]<<",";
    }
    cout<<endl;
    
    //sort(vi.begin(),vi.end());
    sort(vi.begin(),vi.end(),compare);
    for(int i=0;i<vi.size();i++)
    {
        cout<<vi[i]<<",";
    }
    
    cout<<endl<<vi.empty()<<endl<<vi.size();
	cout  << "test\n";
	return 0;
}

2 迭代器遍历:

#include <iostream>
#include <vector>
#include<string.h>
#include<algorithm>
using namespace std;

bool compare(int a,int b){
    return a>b;
}

int main() {
    
    vector<vector<int> > vi2D;
    int ai[]={0,1,2,3,4};
    vector<int> vi(&ai[0],&ai[5]);
    
    for(int i=0; i<2;i++){
        vi2D.push_back(vi);
    }
    
    cout<<"Using array index method"<<endl;

    for(int i=0;i<vi2D.size();i++)
    {
        for(int j=0;j<vi2D[i].size();j++)
        cout<<vi2D[i][j]<<",";
        cout<<endl;
    }
    
    cout<<"Using iterator to ouput"<<endl;
    
    vector<int >::iterator it;
    for(int i=0;i<vi2D.size();i++)
    {
        for(it=vi2D[i].begin();it<vi2D[i].end();it++)
        cout<<*it<<",";
        cout<<endl;
    }
    
    cout<<endl<<vi.empty()<<endl<<vi2D.size()<<endl;
	cout  << "perfey\n";
	return 0;
}

使用resize()构造 非对称的数组;非常强大
#include <iostream>
#include <vector>
#include<string.h>
#include<algorithm>
using namespace std;

bool compare(int a,int b){
    return a>b;
}

int main() {
    
    vector<vector<char> >vc2D(8);
    
    cout<<"using powerful resize()"<<endl;
    vc2D[0].resize(3);
    vc2D[0][0]='a';
    vc2D[0][1]='b';
    vc2D[0][2]='c';
    
    vc2D[1].resize(4);
    vc2D[1][0]='d';
    vc2D[1][1]='e';
    vc2D[1][2]='f';
    vc2D[1][3]='g';
    
    vc2D[2].resize(8);
    vc2D[2][0]='h';
    vc2D[2][1]='i';
    vc2D[2][2]='j';
    vc2D[2][3]='k';
    vc2D[2][4]='h';
    vc2D[2][5]='i';
    vc2D[2][6]='j';
    vc2D[2][7]='k';
    
    vector<char>::iterator it;
    for(int i=0;i<vc2D.size();i++){
        for(it=vc2D[i].begin();it<vc2D[i].end();it++){
            cout<<*it<<",";
        }
        cout<<endl;
    }
 
    cout<<endl<<vc2D.empty()<<endl<<vc2D.size()<<endl;
	cout  << "perfey\n";
	return 0;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值