C++数据结构_顺序表_vector的使用

STL中的顺序表——vector

        与string类一样 vector 类是随标准 C++引入的标准库的一部分 ,为了使用vector 我们必须包含相关的头文件 :

#include <vector>
using std::vector;

        vector在实例化时不需要申明长度。标准库负责管理和储存元素相关的内存,用户不用担心长度不够,例如:

vector<int> ivec//定义向量对象ivec,向量中每一个元素都是int类型

一.vector的初始化

        vector有两种不同的使用形式,分别为数组习惯和 STL习惯。

  1. 数组习惯用法
vector<int> ivec(5);  //类似数组定义int ivec[5];

        可以通过ivec[索引号] 来访问元素

  1. 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内

  1. 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个接口函数,具体功能见上文函数表。

原创文章 11 获赞 10 访问量 1587

猜你喜欢

转载自blog.csdn.net/weixin_45817309/article/details/105326939
今日推荐