STL之vector

vector

STL vector的内部实现原理及基本用法

初始化vector对象的方式:

vector v1; //未指定初始化方式,因此采用默认方式初始化v1,即长度为0的空容器;

vector v2; //定义对象v2,作为v1的副本;

vector v3(n,i);//定义对象v3,它包含n个数值为i的元素;

vector v4(n); //定义对象v4,v4中包含n个元素,每个元素的值均是0;

其中:T可以为int,float,char,char*(存放字符串或字符指针)。一般用于int动态数值时,定义vector v1,用v1来保存数值元素。

vector的常用函数:只需要包含#include即可

empty():判断vector向量是否为为空,为空时返回真,否则返回假;

begin():返回向量(数组)的首元素的地址;

end():返回向量(数组)的末尾元素的下一个元素(不存在的元素)的地址;

clear():清空向量;

front():返回向量(数组)的第一个元素的数据;

back():返回向量(数组)的最后一个元素的数据;

size():返回向量中元素的个数(即数组长度)

push_back(数据i):将数据插入到向量的尾部;

pop_back():删除向量尾部的数据

// vector_base.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

void display(int &value) {
	cout << value << endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
	cout << "vector的基本操作:" << endl;
	//vector的初始化
	vector<int> money;

	//赋值
	for (int i = 0; i <= 10; i++)
	{
		money.push_back(i);
	}
    //使用迭代器
	vector<int>::iterator ptr = money.begin();//获取向量首元素的地址
	cout << "向量容器的值分别为:" << endl;
	for (; ptr != money.end(); ptr++)
	{
		cout << *ptr << " ";
	}
	cout << endl;
	for each (int  var in money)
	{
		cout << var << " ";
	}
	cout << endl;
	//判断容器是否为空
	if (money.empty())
	{
		cout << "向量为空" << endl;
	}
	else
	{
		cout << "向量不为空" << endl;
	}
	cout << "向量的首元素为:" << money.front() << ";向量的最后一个元素为:" << money.back() << endl;
	cout << "向量的真实大小为:" << money.size() << endl;//10个元素值+结束标记=11
	cout << "向量的总大小为:" << money.max_size() << endl;
	cout << "这个动态数组所能容纳的最大容量为:" << money.capacity() << endl;
	money.resize(15);// 改变money的大小 
	cout << "change the size of money:" << money.size() << endl;
	//对动态数组指定位置进行赋值 
	//money.assign(*(money.begin()), 8888);
	cout << "money.at(0):" <<money.front()<< endl;
	money.assign(1, 999);  //
	cout << money.at(0) << endl;
	//money.erase(money.begin());//
	//cout << "向量的首元素为:" << money.front() << endl;
	//money.pop_back();//
	//cout << "向量的最后一个元素为:" << money.back() << endl;
	money.clear();   //

	system("pause");
	return 0;
}


vector的特点

(1) 指定一块如同数组一样的连续存储,但空间可以动态扩展。即它可以像数组一样数组一样被操作,通过[]符号。可以进行动态操作,通常体现在push_back() pop_back();

(2) 随机访问方便,它像数组一样被访问,即支持[ ] 操作符和vector.at();

(3) 节省空间,因为它是连续存储,在存储数据的区域都是没有被浪费的,但是要明确一点vector 大多情况下并不是满存的,在未存储的区域实际是浪费的;

(4) 在内部进行插入、删除操作效率非常低,这样的操作基本上是被禁止的。Vector 被设计成只能在后端进行追加和删除操作,其原因是vector 内部的实现是按照顺序表的原理

(5) 只能在vector 的最后进行push 和pop ,不能在vector 的头进行push 和pop ;

(6) 当动态添加的数据超过vector 默认分配的大小时要进行内存的重新分配、拷贝与释放,这个操作非常消耗性能。 所以要vector 达到最优的性能,最好在创建vector 时就指定其空间大小。

deque 容器

deque,一个定义在 deque 头文件中的容器模板,可以生成包含 T 类型元素的容器,它以双端队列的形式组织元素。可以在容器的头部和尾部高效地添加或删除对象,这是它相对于 vector 容器的优势。当需要这种功能时,可以选择这种类型的容器。

无论何时,当应用包含先入先出的事务处理时,都应该使用 deque 容器。处理数据库事务或模拟一家超市的结账队列,像这两种应用都可以充分利用 deque 容器。

参考资料:https://blog.csdn.net/ye1223/article/details/79772771

posted @ 2019-08-29 21:52  独孤剑—宇枫  阅读(282)  评论(0编辑  收藏  举报