欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-06 23:32:38
...

作为初学者,为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;
}