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