0
点赞
收藏
分享

微信扫一扫

【C++】STL标准模板库(Vector容器-超详细分步实例代码讲解)

鱼满舱 2022-01-20 阅读 46
c++容器stl

背景


Vector容器

1、介绍

vector 向量容器不但能像数组一样对元素进行随机访问,还能在尾部插入元素,是一种简单、高效的容器,完全可以代替数组。vector还具有内存自动管理的功能,对于元素的插入和删除,可以动态调整所占的内存空间。

使用 vector 向量容器,需要包含头文件<vector>。

vector 向量容器的下标和数组一样,都是从0开始计数的。也就是说,如果 vector 容器的大小是n,那么元素的下标是0~n-1。对于vector向量容器的容量定义,可以事先定义一个固定大小,之后可以随时调整其大小;也可以事先不定义,随时使用 push_back() 方法从尾部扩张元素,也可以使用 insert() 在某个元素位置前插入新元素。

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

2、创建vector对象

创建 vector 对象常用的有如下三种形式:

  1. 不指定容器的元素个数,如定义一个用来存储整型的容器 vector<int> V;
  2. 创建时指定容器的大小,如定义一个用来存储10个double类型元素的向量容器 vector<double> v(10); 元素的下标为0~9;另外,每个元素的值被初始化为0.0。
  3. 创建一个具有n个元素的向量容器对象,每个元素具有指定的初始值 vector<double> v(10, 8.6); 上述语句定义了一个v向量容器,共有10个元素,每个元素的值是8.6。

3、尾部元素扩张

通常使用 push back() 对 vector 向量容器在尾部追加新元素。尾部追加元素,vector 向量容器会自动分配新内存空间。不仅可以对空的 vector 对象扩张,还可对已有元素的 vector 对象扩张。

下面的程序将6,7,8三个元素从尾部添加到v容器中,这样v容器中就有三个元素,其值依次是6,7,8

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

4、下标方式访问 vector 元素

访问或遍历 vector 对象类似于数组的访问方式。对于 vector 对象,可以采用下标方式随意访问它的某个元素,也可以通过下标方式对某元素重新赋值。

下面的程序就是采用下标方式对某元素重新赋值:

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

5、用迭代器访问 vector 元素

通常使用迭代器配合循环语句来对 vector 对象进行遍历访问,迭代器的类型一定要和它要遍历的vector 对象的元素类型一致。

下面的程序采用迭代器对 vector 进行了遍历:

#include <vector>
#include <iostream>
using namespace std;
int main()
{
    vector<int> v(3);
	v[0] = 6;
	v[1] = 7;
	v[2] = 8;
	vector<int>::iterator it; //定义迭代器变量
	for(it=v.begin(); it!=v.end(); it++) {
		cout << *it << " "; 
	} 
	return 0; 
}

6、插入元素

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

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

下面的程序演示了 insert() 方法的用法:

#include <vector>
#include <iostream>
using namespace std;
int main()
{
    vector<int> v(3);
	v[0] = 6;
	v[1] = 7;
	v[2] = 8;
	v.insert(v.begin(),9); //在当前序列的最前面插入新元素,元素值为 9 
	v.insert(v.begin()+2,1); //在当前序列的第 3 个元素前插入新元素 1 
    v.insert(v.end(),3); //在当前序列的末尾追加新元素3 
	vector<int>::iterator it; //定义迭代器变量
	for(it=v.begin(); it!=v.end(); it++) {
		cout << *it << " "; //输出迭代器上的元素值 
	} 
	cout << endl; 
	return 0; 
}

运行结果如下:

7、元素的删除

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

下面的程序演示了 erase() 方法的用法:

#include <vector>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <ctime>
using namespace std;
int main()
{
    srand(time(NULL));
	vector<int> v(10);
	for(int i=0; i<10; i++) {
		v[i] = rand() % 100; //给向量赋值 
	} 
	vector<int>::iterator it; //定义迭代器变量
	
	for(it=v.begin(); it!=v.end(); it++) {
		cout << *it << " "; //输出原始迭代器上的元素值 
	} 
	cout << endl; 
	
	v.erase(v.begin()+2); //删除第 3 个 元素
	for(it=v.begin(); it!=v.end(); it++) {
		cout << *it << " "; //输出处理后迭代器上的元素值 
	}  
	cout << endl; 
	
	v.erase(v.begin()+1,v.begin()+5); //删除迭代器第 2 到 6 区间的数 
	for(it=v.begin(); it!=v.end(); it++) {
		cout << *it << " "; //输出处理后迭代器上的元素值 
	} 
	cout << endl; 
	
	v.clear(); //清空向量
	cout << v.size() <<endl; //输出向量大小
	return 0; 
}

运行结果如下(因随机数不同有差异):

8、使用 reverse 反向排列算法

reverse() 反向排列算法,需要包含头文件 algorithm。reverse 算法可将向量中某段迭代器区间元素反向排列,看下面这段代码:

#include <vector>
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <ctime>
using namespace std;
int main()
{
    srand(time(NULL));
	vector<int> v(10);
	for(int i=0; i<10; i++) {
		v[i] = rand() % 100; //给向量赋值 
	} 
	vector<int>::iterator it; //定义迭代器变量
	
	for(it=v.begin(); it!=v.end(); it++) {
		cout << *it << " "; //输出原始迭代器上的元素值 
	} 
	cout << endl; 
	
	reverse(v.begin(),v.end()); //反向排列向量从首到尾的元素 
	for(it=v.begin(); it!=v.end(); it++) {
		cout << *it << " "; //输出处理后迭代器上的元素值 
	} 
	cout << endl; 
	return 0; 
}

运行结果如下:

9、使用 sort 算法对向量元素排序

使用 sort 算法,需要包含头文件 algorithm。sort 算法要求使用随机访问迭代器进行排序,在默认的情况下,对向量元素进行升序排列。

下面的程序说明了 sort 算法的使用方法:

#include <vector>
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <ctime>
using namespace std;
int main()
{
    srand(time(NULL));
	vector<int> v;
	for(int i=0; i<10; i++) {
		v.push_back(rand() % 100); //给向量赋值 
	} 
	
	for(int i=0; i<10; i++) {
		cout << v[i] << " "; //输出排序前的元素值 
	} 
	cout << endl;
	
	sort(v.begin(),v.end());
	for(int i=0; i<10; i++) {
		cout << v[i] << " "; //输出排序后的元素值 
	} 

	cout << endl; 
	return 0; 
}

运行结果如下:

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

下面的程序设计了一个排序比较函数 cmp,要求对元素的值由大到小排序:

#include <vector>
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <ctime>
using namespace std;
bool cmp(const int&a, const int &b) {
	return a > b;
} 
int main()
{
    srand(time(NULL));
	vector<int> v;
	for(int i=0; i<10; i++) {
		v.push_back(rand() % 100); //给向量赋值 
	} 
	
	for(int i=0; i<10; i++) {
		cout << v[i] << " "; //输出排序前的元素值 
	} 
	cout << endl;
	
	sort(v.begin(),v.end(),cmp); //按cmp函数比较规则排序 
	for(int i=0; i<10; i++) {
		cout << v[i] << " "; //输出排序后的元素值 
	} 

	cout << endl; 
	return 0; 
}

运行结果如下:

10、向量的大小

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

下面的程序演示了 size() 方法和 empty() 方法的用法:

#include <vector>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <ctime>
using namespace std;
int main()
{
    srand(time(NULL));
	vector<int> v(10);
	for(int i=0; i<10; i++) {
		v[i] = rand() % 100; //给向量赋值 
	} 
	cout << v.size() << endl; //输出向量大小,即包含了多少元素 
	cout << v.empty() << endl; //如果向量空,则返回逻辑假,输出0;反之亦然 
	v.clear(); //清空向量 
	cout << v.empty() << endl; 
	return 0; 
}

运行结果如下:

 

举报

相关推荐

0 条评论