STL中的顺序表——vector
与string类一样 vector 类是随标准 C++引入的标准库的一部分 ,为了使用vector 我们必须包含相关的头文件 :
#include <vector>
using std::vector;
vector在实例化时不需要申明长度。标准库负责管理和储存元素相关的内存,用户不用担心长度不够,例如:
vector<int> ivec//定义向量对象ivec,向量中每一个元素都是int类型
一.vector的初始化
vector有两种不同的使用形式,分别为数组习惯和 STL习惯。
- 数组习惯用法
vector<int> ivec(5); //类似数组定义int ivec[5];
可以通过ivec[索引号] 来访问元素
- STL习惯
在定义vector的元素时,可以为每个元素提供一个显式的初始值来完成初始化,例如:
vector<int> ivec(2,1)
定义了ivec,包含2个int类型的元素,每个元素初始化为1
对于数组,我们同样可以进行初始化,例如:
int ia[2]={0,1};
但是我们不能用同样的方式初始化vector,但是可以通过数组来对vector进行初始化,例如:
vector<int> ivec(ia,ia+2)
或者:
vector<int> ivec(&ia[0],&ia[1])
表示将a[0],a[1]的元素拷贝到ivec内
- vector可以被另一个vector初始化,或被赋值给另一个vector,例如:
vector<int> ivec;
vector<int> ivec2(ivec);
ivec2 = ivec;
二.定义在vector类中的方法
方法名 | 方法描述 |
---|---|
back() | 返回最后一个向量的值 |
begin() | 返回指向第一个元素的迭代器 |
capacity() | 返回容量 |
clear() | 将容器清空 |
empty() | 若大小为0,则返回true;否则,返回false |
end() | 返回指向最后一个元素的迭代器 |
erase() | 在向量的任意位置删除元素 |
insert() | 在向量的任意位置插入元素 |
pop_back() | 删除最后一个元素 |
push_back() | 在向量尾部添加元素 |
resize() | 改变容量 |
size() | 返回向量中的元素个数 |
三.vector使用实例
#include<iostream>
using namespace std;
#include<vector>
using std::vector;
void main()
{
vector<PHONEBOOK> vec;
PHONEBOOK pbook[4] = {
{ 20181208, "Mary" ," 13011221827","classmates" },
{ 20181127,"Tom" ,"13934621123”," "family" },
{ 20181156, "John" ,"1324579880" ,"classmates" },
{ 20181133, "Lisa" ," 1378001822”,' classmates" }
};
for (int i = 0; i < 4; i++)
vec.push_back(pbook[i]); //尾部添加4条通信录
cout << "通信录内容列表:" << endl;
for (int i = 0; i < vec.size(); i++)
vec[i].print();//使用数组方式访问每个元素
PHONEBOOK record(20181209,"phoenix","15930209020","teacher");
vec.insert(vec.begin(), record); //在 vec头添加元素record,该操作时间复杂度为0(n)
cout << "通信录内容列表:" << endl;
for (vector<PHONEBOOK>::iterator it = vec.begin(); it != vec.end(); it++)
(*it).print();//使用迭代器访问每个元素
cout << "删除元素:" << endl;
vec.erase((++ ++vec.begin()))->print(); //删除第3位置的元素
cout << "通信录内容列表:" << endl;
for (vector < PHONEBOOK>::iterator it = vec.begin(); it != vec.end(); it++)
(*it).print();//使用迭代器访问每个元素
cout << endl;
}
这里要重点说明的是,上例第一个循环采用下标方式访问向量对象vec中的每个元素,操作与数组相同,但需要注意在使用下标操作符“[]”时要防止地址越界,否则这类错误很难被捕捉到,会导致程序运行结果不确定。为了避免这种错误,一般使用迭代器,如上例中的第二个循环。
定义迭代器的方法如下:
vector <PHONEBOOK>::iterator it;
迭代器类似于指针,可以使用*it访问相应元素。如it= vec.begin()表示迭代器it指向vec的第一个元素;it=vec.end()表示迭代器it指向vec最后一个元素的下一个元素位置。若向量对象vec为空,vec.begin()与vec. end()指向同一个位置。容器的begin() 和end()函数都是常用接口,在程序设计时注意灵活使用。上例中还调用了push_back() 、size( )、insert()、erase()这4个接口函数,具体功能见上文函数表。