C++标准模板库--vector

vector

介绍

        vector(向量)是一种序列容器,表示为可以改变大小的数组。vector中的元素使用连续的存储位置,这意味着也可以使用指向其元素的常规指针+偏移量来访问任意元素,且与数组一样高效。但与数组不同的是,vector的大小可以动态变化,容器会自动处理他们的存储空间。在其内部,vector使用动态分配的数组来存储他们的元素。当插入新元素需要增大容量时,存储空间需要重新分配,这意味着需要分配一个新数组并将所有元素移动到其中。就处理时间而言,这是一个相对昂贵的任务,因此vector不会在每次想容器中添加元素时都重新分配。相反,vector容器可以分配一些额外的存储空间,以适应可能的增长,因此容器的实际容量肯呢个大于包含其元素严格所需的存储空间。因此与数组相比,向量消耗更多的内存,以换取更有效的方式管理存储和动态增长的能力。与其他动态序列容器(deque、列表、前向列表)相比,vector可以非常高效地访问其元素,并且可以相对高效地从其末端添加或删除元素。对于涉及在末尾以外的位置插入或删除元素的操作,他们的性能比其他操作差,并且迭代器引用的一致性不如列表和前向列表。

        以上是官方对于vector的介绍,从上面我们能够了解到vector本质上就是一种可动态增长的顺序表,其特性与数据结构中学习的顺序表相差无几,但vector的出现极大地简化了我们使用顺序表的工作量,且vector与其他容器有着较深的联系,因此学好vector有利于我们未来的学习。


vector的使用

         对于vector,在学习时我们一定要学会查看文档:vector文档,vector在实际中非常重要,我们要熟悉常见的接口,以应对未来的使用。

(constructor)构造函数

函数声明 接口说明
vector(); 无参构造
vector(size_t n, const T& val = T()); 构造并初始化n个val
vector(const vector& x); 拷贝构造
vector(inputiterator first, inputiterator last); 使用迭代器进行区间初始化构造

代码演示:

	//构造5个int的空间
	vector v1(5);
	//构造10个int空间,并初始化为1
	vector v2(10, 1);
	//去掉v2的第一个和最后一个空间,使用剩余空间构造并用相同数值初始化
	vector v3(++v2.begin(), --v2.end());
	//拷贝构造
	vector v4 = v3;

iterator迭代器的使用

函数名称 接口说明
begin+end 获取第一个数据位置的iterator/const_iterator,获取最后一个数据的下一个位置的iterator/const_iterator.
rbegin+rend 获取最后一个数据位置的reverse_iterator,获取第一个数据前一个位置的reverse_iterator

C++标准模板库--vector_第1张图片

 代码演示:

vector v(10, 1);
// []下标形式
for (size_t i = 0; i < v.size(); i++)
{
	cout << v[i] << " ";
}
cout << endl;

//迭代器
vector::iterator it = v.begin();
while (it != v.end())
{
	cout << *it << " ";
	it++;
}
cout << endl;

//反向迭代器
vector::reverse_iterator rit = v.rbegin();
while(rit != v.rend())
{
    cout << *rit << " ";
    rit++;
}
cout << endl;

//范围for
for (auto& e : v)
{
	cout << e << " ";
}
cout << endl;

空间管理函数

函数名称 接口说明
size

获取数据个数

capacity 获取容量大小
empty 判断是否为空
resize 改变vector的_size
reserve 改变vector的capacity

注意:

  • capacity函数在vs和g++下的扩容机制略有不同,vs下capacity是按1.5倍增长的,g++下是按2倍增长的。在面试中经常会考察这个问题,不要固化地认为vector的扩容都是2倍,具体增长多少是根据具体的需求来定义的。vs是PJ版本STL,g++是SGI版本STL。
  • reserve函数只负责开空间,如果明确知道需要开多少空间,reserve就可以一次性开好,缓解了多次扩容的代价。
  • resize在开空间的同时还会进行初始化,影响_size。

扩容机制测试代码:

// 测试vector的默认扩容机制
void TestVectorExpand()
{
	size_t sz;
	vector v;
	sz = v.capacity();
	cout << "making v grow:\n";
	for (int i = 0; i < 100; ++i)
	{
		v.push_back(i);
		if (sz != v.capacity())
		{
			sz = v.capacity();
			cout << "capacity changed: " << sz << '\n';
		}
	}
}

 内存管理函数

你可能感兴趣的:(C++,c++,开发语言)