C++编程基础——顺序容器(vector、list、deque)

本文详细介绍了C++ STL中的vector、list和deque三种容器的使用方法,包括声明、初始化、基本操作、元素访问及控制等内容。通过多个实例演示了如何在实际编程中运用这些容器,帮助读者掌握高效编程技巧。

vector向量

一、向量的介绍
    向量 vector 是一种对象实体, 能够容纳许多其他类型相同的元素, 因此又被称为容器。 与string相同, vector 同属于STL(Standard Template Library, 标准模板库)中的一种自定义的数据类型, 可以广义上认为是数组的增强版。
   在使用它时, 需要包含头文件 vector, #include<vector>
   vector 容器与数组相比其优点在于它能够根据需要随时自动调整自身的大小以便容下所要放入的元素。此外, vector 也提供了许多的方法来对自身进行操作。

向量的声明及初始化
   1、vector 型变量的声明以及初始化的形式也有许多, 常用的有以下几种形式:

vector<int> a ;//声明一个int型向量a
vector<int> a(10);//声明一个初始大小为10的向量
vector<int> a(10,1);//声明一个初始大小为10且初始值都为1的向量
vector<int> b(a);//声明并用向量a初始化向量b
vector<int> b(a.begin(), a.begin()+3);//将a向量中从第0个到第2个(共3个)作为向量b的初始值

 2、 除此之外, 还可以直接使用数组来初始化向量:

int n[]={1,2,3,4,5};
vector<int> a(n, n+5);//将数组n的前5个元素作为向量a的初值
vector<int> a(&n[1],&n[4]);//将n[1] - n[4]范围内的元素作为向量a的初值

三、元素的输入及访问
   元素的输入和访问可以像操作普通的数组那样, 用cin>>进行输入, cout<<a[n]这样进行输出:
   示例:

#include<iostream>
#include<vector>

usingnamespace std ;

int main()
{
          vector<int> a(10,0);//大小为10初值为0的向量a

//对其中部分元素进行输入
         cin >>a[2];
         cin >>a[5];
         cin >>a[6];

//全部输出
int i ;
for(i=0; i<a.size(); i++)
            cout<<a[i]<<" ";
return0;
}

 

在元素的输出上, 还可以使用遍历器(又称迭代器)进行输出控制。在 vector<int> b(a.begin(), a.begin()+3) ; 这种声明形式中, (a.begin()、a.begin()+3) 表示向量起始元素位置到起始元素+3之间的元素位置。(a.begin(), a.end())则表示起始元素和最后一个元素之外的元素位置。
   向量元素的位置便成为遍历器, 同时, 向量元素的位置也是一种数据类型, 在向量中遍历器的类型为:vector<int>::iterator。 遍历器不但表示元素位置, 还可以再容器中前后移动。
   
   在上例中讲元素全部输出部分的代码就可以改写为:

vector<int>::iterator t ;
for(t=a.begin(); t!=a.end(); t++)
        cout<<*t<<" ";

*t 为指针的间接访问形式, 意思是访问t所指向的元素值。

四、向量的基本操作

1>. a.size()//获取向量中的元素个数
2>. a.empty()//判断向量是否为空
3>. a.clear()//清空向量中的元素

4>.复制
     a = b ;//将b向量复制到a向量中

5>.比较
保持==、!=、>、>=、<、<=的惯有含义;
如: a == b ;//a向量与b向量比较, 相等则返回1

6>.插入- insert
①、 a.insert(a.begin(),1000);//将1000插入到向量a的起始位置前

②、 a.insert(a.begin(),3,1000);//将1000分别插入到向量元素位置的0-2处(共3个元素)

③、 vector<int> a(5,1);
         vector<int> b(10);
         b.insert(b.begin(), a.begin(), a.end());//将a.begin(), a.end()之间的全部元素插入到b.begin()前

7>.删除- erase
①、 b.erase(b.begin());//将起始位置的元素删除
②、 b.erase(b.begin(), b.begin()+3);//将(b.begin(), b.begin()+3)之间的元素删除

8>.交换- swap
    b.swap(a);//a向量与b向量进行交换


【综合实例】

#include <vector>
#include <iostream>
#include <Windows.h>

usingnamespace std;

int main ()
{
//初始化
    vector<int>a(10,2);
    vector<int>b(a);//初始化并赋值
//用数组进行初始化
int n[]={1,2,3,4,5,6,7,8};
    vector<int>c(n,n+5);//前5个
    vector<int>d(&n[0],&n[4]);//第1个到第4个
    vector<int>e(c.begin(),c.begin()+3);//从0开始  3个

char szbuffer[100];
for(int i =0;i<a.size();i++)
{
        sprintf(szbuffer,"a = %d",a[i]);//第一种输出方式
        puts(szbuffer);

}

    vector<int>::iterator tb;// 迭代器输出全部

for(tb = b.begin();tb != b.end();tb++)
{
        cout<<"b = "<<*tb<<endl;//第二种输出方式
}

    vector<int>::iterator tc;

for(tc = c.begin();tc != c.end();tc++)
{
        cout<<"c = "<<*tc<<endl;
}

    vector<int>::iterator td;

for(td = d.begin();td != d.end();td++)
{
        cout<<"d = "<<*td<<endl;
}


    vector<int>::iterator te;

for(te = e.begin();te != e.end();te++)
{
        cout<<"e = "<<*te<<endl;
}

//常用方法

    vector<int>var(10,5);
    vector<int>::iterator tx;
for(tx = var.begin();tx!=var.end();tx++)
{
        cout<<"befor var = "<<*tx<<endl;
}

    var.erase(var.begin(),var.end());
for(tx = var.begin();tx!=var.end();tx++)
{
        cout<<"after var = "<<*tx<<endl;
}

if(var.empty())

{
        cout<<"已清空"<<endl;

}
    var.insert(var.begin(),a.begin(),a.end());

for(tx = var.begin();tx!=var.end();tx++)
{
        cout<<"插入后的值为 var = "<<*tx<<endl;
}

return0;
}

二维向量
   与数组相同, 向量也可以增加维数, 例如声明一个m*n大小的二维向量方式可以像如下形式:

  vector< vector<int>> b(10, vector<int>(5));//创建一个10*5的int型二维向量

   在这里, 实际上创建的是一个向量中元素为向量的向量。同样可以根据一维向量的相关特性对二维向量进行操作。

#include<iostream>
#include<vector>

usingnamespace std ;

int main()
{
          vector< vector<int>> b(10, vector<int>(5,0));

//对部分数据进行输入
         cin>>b[1][1];
         cin>>b[2][2];
         cin>>b[3][3];

//全部输出
int m, n ;
for(m=0; m<b.size(); m++)//b.size()获取行向量的大小
{
for(n=0; n<b[m].size(); n++)//获取向量中具体每个向量的大小
                 cout<<b[m][n]<<" ";
            cout<<"\n";
}

return0;
}


 同样, 按照这样的思路我们还可以创建更多维的向量, 不过维数太多会让向量变得难以灵活控制, 三维以上的向量还需酌情使用。

                                          顺序容器之list

list是stl实现的双向链表,与向量vector想比,它允许快速的插入和删除,但是随机访问却是比较慢,需要添加头文件#include<list>

//1.定义和初始化
    list<int> lst1;//创建空list
    list<int> lst2(3);//创建含有三个元素的list
    list<int> lst3(3,2);//创建含有三个元素为2的list
    list<int> lst4(lst2);//使用lst2初始化lst4
    list<int> lst5(lst2.begin(),lst2.end());//同lst4

//2.常用操作方法
    lst1.assign(lst2.begin(),lst2.end());//分配值,3个值为0的元素
    lst1.push_back(10);//末尾添加值
    lst1.pop_back();//删除末尾值
    lst1.begin();//返回首值的迭代器
    lst1.end();//返回尾值的迭代器
    lst1.clear();//清空值
bool isEmpty1 = lst1.empty();//判断为空
    lst1.erase(lst1.begin(),lst1.end());//删除元素
    lst1.front();//返回第一个元素的引用
    lst1.back();//返回最后一个元素的引用
    lst1.insert(lst1.begin(),3,2);//从指定位置插入个3个值为2的元素
    lst1.rbegin();//返回第一个元素的前向指针
    lst1.remove(2);//相同的元素全部删除
    lst1.reverse();//反转
    lst1.size();//含有元素个数
    lst1.sort();//排序
    lst1.unique();//删除相邻重复元素

//3.遍历
//迭代器法
for(list<int>::const_iterator iter = lst1.begin();iter != lst1.end();iter++)
{
       cout<<*iter;
}

【综合实例】

#include <list>
#include <iostream>
usingnamespace std;

void main()

{
    list<int>varlist(10,2);
    list<int>:: const_iterator it;//常类型的迭代器
for( it = varlist.begin();it != varlist.end();++it)
{
        cout<<*it<<endl;
}

int nsize = varlist.size();
    cout <<"个数是"<<nsize<<endl;

    varlist.push_back(100);
    cout<<"末尾添加元素之后的值为"<<endl;
for( it = varlist.begin();it != varlist.end();++it)
{
        cout<<*it<<endl;
}

    varlist.pop_back();//注意此处没有传参
    cout<<"删除末尾的元素值后"<<endl;
for( it = varlist.begin();it != varlist.end();++it)
{
        cout<<*it<<endl;
}

    varlist.insert(varlist.begin(),2,3);//在开始出插入两个3
    cout<<"开头处插入后的值为"<<endl;
for( it = varlist.begin();it != varlist.end();++it)
{
        cout<<*it<<endl;
}

    varlist.insert(varlist.end(),2,4);//在末尾处出插入两个4
    cout<<"末尾处处插入后的值为"<<endl;
for( it = varlist.begin();it != varlist.end();++it)
{
        cout<<*it<<endl;
}

int c = varlist.front();
    cout<<"第一个元素的引用为  "<<c<<endl;
    varlist.push_front(5);
    cout<<"push_front 后的值为 "<<c<<endl;
for( it = varlist.begin();it != varlist.end();++it)
{
        cout<<*it<<endl;
}

}

 

                             顺序容器之deque


  deque容器类与vector类似,支持随机访问和快速插入和删除,与vector不同,deque还支持从开始端插入数据:push_front。其余的类似vector操作方法的使用

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值