C++序列容器之std::vector常见用法学习总结

Vector是C++标准程序库中的一个类,可视为会自动扩展容量的数组,以循序(Sequential)的方式维护变量集合。vector的特色有支持随机存取,在集合尾端增删元素很快,但是在集合中间增删元素比较费时。

vector是C++标准程序库中的众多容器(container)之一。 vector以模板(泛型)方式实现,可以保存任意类型的变量,包括用户自定义的数据类型,例如:它可以是放置整数(int)类型的vector、也可以是放置字符串(string)类型的 vector、或者放置用户自定类别(user-defined class)的vector。

vector 定义于<vector>头文件中。与其他STL组件一样,vector属于std名称空间。

访问元素的方法
vec[i] – 访问索引值为 i 的元素引用。 (索引值从零起算,故第一个元素是vec[0]。)
vec.at(i) – 访问索引值为 i 的元素的引用,以 at() 访问会做数组边界检查,如果访问越界将会抛出一个例外,这是与operator[]的唯一差异。
vec.front() – 回传vector第一个元素的引用。
vec.back() – 回传vector最尾端元素的引用。

新增或移除元素的方法
vec.push_back() – 新增元素至vector的尾端,必要时会进行内存配置。
vec.pop_back() – 删除vector最尾端的元素。
vec.insert() – 插入一个或多个元素至 vector 内的任意位置。
vec.erase() – 删除vector中一个或多个元素。
vec.clear() – 清空所有元素。

获取长度/容量
vec.size() – 获取vector目前持有的元素个数。
vec.empty() – 如果vector内部为空,则传回true值。
vec.capacity() – 获取vector目前可容纳的最大元素个数。这个方法与内存的配置有关,它通常只会增加,不会因为元素被删减而随之减少。

重新配置/重置长度
vec.reserve() – 如有必要,可改变vector的容量大小(配置更多的内存)。在众多的 STL 实例,容量只能增加,不可以减少。
vec.resize() – 改变vector目前持有的元素个数。

迭代 (Iterator)
vec.begin() – 回传一个Iterator,它指向vector第一个元素。
vec.end() – 回传一个Iterator,它指向vector最尾端元素的下一个位置(请注意:它不是最末元素)。
vec.rbegin() – 回传一个反向Iterator,它指向vector最尾端元素的。
vec.rend() – 回传一个Iterator,它指向vector的第一个元素。

示例代码

#include <iostream>
#include <vector>
#include <algorithm>
#include <iomanip>
#include <cstdlib>
#include <ctime>
using namespace std;

bool compare(int &a, int &b)
{
	return a < b;
}

int main(void)
{
	vector<int> vec;

	srand((unsigned int)time(NULL));
	// 插入
	for(int i=0; i<10; i++)
	{
		vec.push_back(rand()%100);
	}

	// 遍历 - 范围for循环
	for(int i : vec)
	{
		cout << setw(6) << i;
	}
	cout << endl;

	// 修改
	for(int &i : vec)
	{
		i = i * i;
	}

	// 遍历 - vector下标
	for(vector<int>::size_type index = 0; index < vec.size(); index++)
	{
		cout << setw(6) << vec[index];
	}
	cout << endl;

	// 倒转
	reverse(vec.begin(), vec.end());

	// 遍历 - 迭代器
	for(vector<int>::iterator it = vec.begin(); it != vec.end(); it++)
	{
		cout << setw(6) << *it;
	}
	cout << endl;

	// 排序
	sort(vec.begin(), vec.end(), compare);

	for(auto i : vec)
	{
		cout << setw(6) << i;
	}
	cout << endl;

	return 0;
}

运行结果

[ycxie@fedora Workspace]$ g++ testvector.cpp -o testvector -Wall
[ycxie@fedora Workspace]$ ./testvector
    50    49    69    36    89    21    36    23    28    86
  2500  2401  4761  1296  7921   441  1296   529   784  7396
  7396   784   529  1296   441  7921  1296  4761  2401  2500
   441   529   784  1296  1296  2401  2500  4761  7396  7921
[ycxie@fedora Workspace]$ ./testvector
    61    88    24     5    22    84    66    42    64    43
  3721  7744   576    25   484  7056  4356  1764  4096  1849
  1849  4096  1764  4356  7056   484    25   576  7744  3721
    25   484   576  1764  1849  3721  4096  4356  7056  7744
[ycxie@fedora Workspace]$ ./testvector
    10    19    95     5    46     7    78    99    60    98
   100   361  9025    25  2116    49  6084  9801  3600  9604
  9604  3600  9801  6084    49  2116    25  9025   361   100
    25    49   100   361  2116  3600  6084  9025  9604  9801

Leave a Reply

Your email address will not be published. Required fields are marked *