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语言中文网)

猜你喜欢

转载自blog.csdn.net/m0_46308273/article/details/114480094