vector向量容器

本文详细介绍了C++ STL中的Vector容器,包括其特点、创建方式、尾部元素扩张、遍历、插入、删除、排序等操作。Vector提供随机访问和动态扩容的能力,可以作为数组的替代品。通过begin()和end()获取迭代器进行遍历,利用push_back()、insert()、erase()和clear()等方法进行元素管理。同时,文章还展示了如何使用sort算法对向量进行排序,以及查询向量的大小和判断是否为空。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Vector向量容器不但能像数组一样对元素进行随机访问,还能在尾部插入元素,是一种简单,高效的容器,完全可以代替数组。

Vector容器的下标是从0开始的。对于Vector容器的容量定义,可以事先定义一个固定大小,事后,可以随时调整其大小;也可以事先不定义,随时使用push_back()方法从尾部扩张元素,也可以使用insert()在某个位置前插入新元素。

Vector有两个重要的方法,begin()和end(),begin()返回的是首元素位置的迭代器,end()返回的是最后一个元素的下一个元素位置的迭代器。


1.创建Vector对象

创建Vector对象常用的有三种方式。

(1)不指定容器的元素个数,如定义一个用来存储整型的容器:

vector<int> v;


(2)创建时指定容器的大小,如定义一个用来存储10个double类型元素的向量容器:

vector<double> v(10);


(3)创建一个具有n个元素的向量容器对象,每个元素具有指定的初始值:

vector<double> v(10,8.6);
上述语句定义了v向量容器,共有10个元素,每个元素的值都是8.6。


2.尾部元素扩张

通常使用push_back()对vector容器在尾部追加新元素。追加新元素时,vector容器会自动分配新内存空间。可对空的vector对象扩张,也可以对已有元素的vector对象扩张,如:

#include<iostream>
#include<vector>
using namespace std;
int main()
{
	vector<int> v;
	v.push_back(5);
	v.push_back(2);
	v.push_back(3);
	return 0;
}


3.下标方式访问vector元素

访问或者遍历vector对象是常要做的事。对于vector对象,可以采用下标方式随意访问它的某个元素,当然,也可以以下标方式对莫元素重新赋值,这点类似于数组的下标访问方式,如:

#include<iostream>
#include<vector>
using namespace std;
int main()
{
	vector<int> v(3);
    v[0]=5;
    v[1]=2;
    v[2]=3;
    cout<<v[0]<<" "<<v[1]<<" "<<v[2]<<endl;
	return 0;
}


4.用迭代器访问vector元素

常使用迭代器配合循环语句来对vector对象进行遍历,迭代器的类型一定要与它遍历的vector对象的元素类型一致,如:

#include<iostream>
#include<vector>
using namespace std;
int main()
{
	vector<int> v(3);
    v[0]=5;
    v[1]=2;
    v[2]=3;
    vector<int>::iterator it;   //定义迭代器变量
    for(it=v.begin();it!=v.end();it++)
        cout<<*it<<" ";     //迭代器就是为了数据结构的泛化而设计的一种特殊的指针
    cout<<endl;
	return 0;
}

5.元素的插入

insert()方法可以在vector对象的任意位置前插入一个新的元素,同时,vector自动扩张一个元素空间,插入位置后的所有元素依次向后挪动一个位置。

要注意的是,insert()方法要求插入的位置,是元素的迭代器位置,而不是元素的下标,如:

#include<iostream>
#include<vector>
using namespace std;
int main()
{
	vector<int> v(3);
    v[0]=2;
    v[1]=5;
    v[2]=2;
    v.insert(v.begin(),8);  //在第0个新元素,元素的值为8
    v.insert(v.begin()+2,3);    //在第2个元素前插入新元素1,注意要算上之前插到最前面的元素8
    v.insert(v.end(),3);    //在向量末尾追加新元素3,因为end()方法返回的是最后一个元素的下一个元素位置
    vector<int>::iterator it; 
    for(it=v.begin();it!=v.end();it++)
        cout<<*it<<" ";    
    cout<<endl;
	return 0;
}

6.元素的删除

erase()方法可以删除vector中迭代器所指的一个元素或一段区间中的所有元素。

clear()方法是一次性删除vector中所有的元素,如:

#include<iostream>
#include<vector>
using namespace std;
int main()
{
    vector<int> v(10);
    for(int i(0);i<10;i++)
        v[i]=i;
    v.erase(v.begin()+2);   //删除第2个元素,从0开始计数
    vector<int>::iterator it;
    for(it=v.begin();it!=v.end();it++)
        cout<<*it<<" ";
    cout<<endl;
    v.erase(v.begin()+1,v.begin()+5);   //删除迭代器第1到第5区间的所有元素
    for(it=v.begin();it!=v.end();it++)
        cout<<*it<<" ";
    cout<<endl;
    v.clear();  //清空向量
    cout<<v.size()<<endl;   //输出向量大小
	return 0;
}

7.使用reverse反向排序算法

reverse反向排序算法需要定义头文件#include<algorithm>,reverse算法可以将向量中某段迭代器区间元素反向排序,如:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
    vector<int> v(10);
    for(int i(0);i<10;i++)
        v[i]=i;
    reverse(v.begin()+3,v.end()-3);<span style="white-space:pre">	//就是对区间中的元素反向排序</span>
    vector<int>::iterator it;
    for(it=v.begin();it!=v.end();it++)
        cout<<*it<<" ";
	return 0;
}
运行结果:0 1 2 6 5 4 3 7 8 9

8.使用sort算法对向量进行排序

使用sort算法,需要头文件#include<algorithm>,sort算法要求使用随机访问迭代器进行排序,在默认的情况下,对向量中的元素进行升序排序,如:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
    vector<int> v;
    for(int i(0);i<10;i++)
        v.push_back(9-i);
    vector<int>::iterator it;
    for(it=v.begin();it!=v.end();it++)
        cout<<*it<<" ";
    cout<<endl;
    sort(v.begin()+1,v.end()-1);    //对区间中的值进行升序排序
    for(it=v.begin();it!=v.end();it++)
        cout<<*it<<" ";
    cout<<endl;
	return 0;
}
运行结果:

9 8 7 6 5 4 3 2 1 0

9 1 2 3 4 5 6 7 8 0


还可以自己设计排序比较函数,然后,把这个函数指定给sort算法,那么sort就根据这个比较函数指定的排序规则进行排序,如:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
bool cmp(const int &a,const int &b)	//自己设计排序比较函数,对元素的值进行降序排序
{
    return a>b;	
}
int main()
{
    vector<int> v;
    for(int i(0);i<10;i++)
        v.push_back(i);
    vector<int>::iterator it;
    for(it=v.begin();it!=v.end();it++)
        cout<<*it<<" ";
    cout<<endl;
    sort(v.begin()+1,v.end()-1,cmp);    //对区间中的值进行升序排序
    for(it=v.begin();it!=v.end();it++)
        cout<<*it<<" ";
    cout<<endl;
	return 0;
}
运行结果:

0 1 2 3 4 5 6 7 8 9

0 8 7 6 5 4 3 2 1 9

9.向量的大小

使用size()方法可以返回向量的大小,即元素的个数。

使用empty()方法返回向量是否为空,如:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
bool cmp(const int &a,const int &b)
{
    return a>b;
}
int main()
{
    vector<int> v(10);  //向量的大小为10
    for(int i(0);i<5;i++)
        v[i]=i;
    cout<<v.size()<<endl;
    cout<<v.empty()<<endl;  //如果非空返回逻辑假即0,否则返回逻辑真即1
    v.clear();
    cout<<v.empty()<<endl;
    vector<int>::iterator it;
	return 0;
}
运行结果:

10

0

1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值