本文主要介绍STL中的vector的概念及用法。
1. 概述
vector是C++ STL中的部分内容,是同一种类型的对象的集合,每个对象都有一个对应的整数索引值,和(C++中的)string对象一样,标准库负责管理与存储元素相关的内存。
我们有时候会把vector称为容器,是因为它可以包含其他对象,能够存放任意类型的动态数组、增加和压缩数据。一个容器中的所有对象都必须是同一种类型的。
vector不是一种数据类型,而是一个类模板(class template)。使用模板可以编写一个类定义或函数定义,用于多个不同的数据类型,因此,我们可以定义保存string对象的vector、或保存int值的vector、又或是保存自定义的类型对象的vector。
2. 常见用法
2.1 构造vector
通常我们采用下面的方式构造vector:
typedef vector<int> vecInt; vecInt vecint;
2.2 添加元素
vector添加数据的缺省方法是push_back(),push_back()函数表示将数据添加到vector的尾部,并按需要来分配内存,如下:
vecint.push_back(i+1);
2.3 遍历元素
我们可以通过使用vector的迭代器iterator、调用vector对象的begin()和end()函数,实现对于vector中数据的遍历,如下:
vecInt::iterator it; for (it = vecint.begin(); it != vecint.end(); it++) { cout << *it << endl; }
2.4 查询元素
通常使用at方法查询(访问)元素,at方法会检查下标是否越界,如果是,则抛出“out of range”异常。用法如下:
vecint.at(1)
2.5 删除元素
使用erase(pos)方法来删除元素,erase()方法删除pos位置的数据,返回下一个数据的位置。用法如下:
// 删除数据,删除最后一个元素 it = vecint.end(); it = it - 1; // 需要注意,(it - 1)对应最后一个元素 vecint.erase(it);
2.6 插入元素
使用insert(pos, elem)方法,在pos位置插入一个elem拷贝,返回新数据位置。用法如下:
// 插入数据,在最后一个元素之前插入数据 it = vecint.end(); it = it - 1; vecint.insert(it, 100);
注意:在删除和插入元素时,需要特别注意pos位置(及迭代器对象it)对应的元素位置。vecint.end()方法会指向最后一个元素的下一个位置,所以删除最后一个元素/在最后一个元素之前插入元素时,需要(it -1)。
3. 示例程序
本文前面介绍的代码对应的完整示例程序如下:
#include <vector> #include <iostream> using namespace std; int main() { typedef vector<int> vecInt; vecInt vecint; // 添加数据 for (int i = 0; i < 5; i++) { vecint.push_back(i+1); } // 遍历元素 vecInt::iterator it; cout << "vecint is: " << endl; for (it = vecint.begin(); it != vecint.end(); it++) { cout << *it << endl; } // 查询数据 cout << "the second element is: " << vecint.at(1) << endl; // 删除数据,删除最后一个元素 it = vecint.end(); it = it - 1; // 需要注意,(it - 1)对应最后一个元素 vecint.erase(it); // 再次遍历元素,观察删除操作是否成功 cout << "after del, vecint is: " << endl; for (it = vecint.begin(); it != vecint.end(); it++) { cout << *it << endl; } // 插入数据,在最后一个元素之前插入数据 it = vecint.end(); it = it - 1; vecint.insert(it, 100); // 再次遍历元素,观察插入操作是否成功 cout << "after insert, vecint is: " << endl; for (it = vecint.begin(); it != vecint.end(); it++) { cout << *it << endl; } return 0; }
上述代码的运行结果如下: