C++标准模板库STL模板类vector浅析

什么是vector

解释一:

计算中,矢量(vector) 对应数组,而不是数学矢量。

在数学中,可以使用N个分量来表示N维数学矢量,因此从这方面讲,数学矢量类似一个N维数组。
然而,数学矢量还有一些计算机矢量不具备的其他特征,如内乘积和外乘积。

计算机矢量存储了一组可随机访问的值,即可以使用索引来直接访问矢量的第10个元素,而不必首先访问前面9个元素。

解释二:

vector 容器是 STL 中最常用的容器之一,它和 array 容器非常类似,都可以看做是对 C++ 普通数组的“升级版”。不同之处在于,array 实现的是静态数组(容量固定的数组),而 vector 实现的是一个动态数组,即可以进行元素的插入和删除,在此过程中,vector 会动态调整所占用的内存空间,整个过程无需人工干预

vector 常被称为向量容器,因为该容器擅长在尾部插入或删除元素,在常量时间内就可以完成,时间复杂度为O(1);而对于在容器头部或者中部插入或删除元素,则花费时间要长一些(移动元素需要耗费时间),时间复杂度为线性阶O(n)

可执行的操作

vector 容器以类模板 vector( T 表示存储元素的类型)的形式定义在 头文件中,并位于 std 命名空间中。
故我们在使用之前需要引入头文件:

#include <vector>
// 命名空间也可以在使用容器时额外注明
using namespace std;

常见 vector 容器的成员函数如下:

函数成员函数功能
begin()返回指向容器中第一个元素的迭代器
end()返回指向容器中最后一个元素位置后一个位置的迭代器
rbegin()返回指向容器中最后一个元素的迭代器
rend()返回指向容器中第一个元素位置前一个位置的迭代器
size()返回实际元素个数
empty()判断容器中是否有元素,若无元素,则返回 true
reserve()增加容器的容量
front()返回第一个元素的引用
back()返回最后一个元素的引用
push_back()在序列的尾部添加一个元素
pop_back()移出序列尾部的元素
insert()在指定的位置插入一个或多个元素
erase()移出一个或一段元素
clear()移出所有的元素,容器大小变为0
swap()交换两个容器的所有元素

测试代码

如下程序简单演示了 size()、begin()、end()、push_back()、erase() 和 insert()的用法:

#include <iostream>
#include <string>
#include <vector>

struct Review
{
	std::string title;
	int rating;
};
// 输入Review对象
bool FillReview(Review& rr);
// 输出Review对象
void ShowReview(const Review& rr);

int main()
{
	using std::cout;
	using std::vector;
	vector<Review> books;
	Review temp;
	while (FillReview(temp))
		books.push_back(temp);
	int num = books.size();
	if (num > 0)
	{
		cout << "Thank you. You entered the following:\n"
			<< "Rating\tBook\n";
		for (int i = 0; i < num; i++)
		{
			ShowReview(books[i]);
		}
		cout << "Reprising:\n"
			<< "Rating\tBook\n";
		vector<Review>::iterator pr;
		for (pr = books.begin(); pr != books.end(); pr++)
			ShowReview(*pr);
		vector<Review> oldlist(books);    // 使用了拷贝构造
		if (num > 3)
		{
			// 删除两个元素
			books.erase(books.begin() + 1, books.begin() + 3);
			cout << "After erasure:\n";
			for (pr = books.begin(); pr != books.end(); pr++)
			{
				ShowReview(*pr);
			}

			// 增加一个元素
			books.insert(books.begin(), oldlist.begin() + 1, oldlist.begin() + 2);
			cout << "After insertion:\n";
			for (pr = books.begin(); pr != books.end(); pr++)
			{
				ShowReview(*pr);
			}

			// 交换
			books.swap(oldlist);	// 将books和oldlist交换
			cout << "Swapping oldlist with books:\n";
			for (pr = books.begin(); pr != books.end(); pr++)
			{
				ShowReview(*pr);
			}
		}
	}
	else
		cout << "Nothing entered, nothing gained.\n";

	return 0;
}

bool FillReview(Review& rr)
{
	std::cout << "Enter book title (quit to quit):";
	// 字符串的输入
	std::getline(std::cin, rr.title);
	if (rr.title == "quit")
		return false;
	std::cout << "Enter book rating:";
	// 整型的输入
	std::cin >> rr.rating;
	// 如果输入的类型和要存入的对象类型不匹配
	// 例如:定义的rr.rating是个int类型,结果输入了string类型
	if (!std::cin)
		return false;
	// 去除输入行的剩余部分
	while (std::cin.get() != '\n')
		continue;

	return true;
}

void ShowReview(const Review& rr)
{
	std::cout << rr.rating << "\t" << rr.title << std::endl;
}

运行结果

运行结果如下:
在这里插入图片描述
在这里插入图片描述

参考资料

【1】Stephen Prata. C++ Primer Plus(第6版)中文版. 北京:人民邮电出版社,2020:35
【2】C++ STL vector 容器详解(C语言中文网)

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值