C++中STL---vector详解

C++中STL—vector详解

vector介绍

  1. vector是表示可变大小的数组的序列容器,当vector元素数量超过已有的vector数量时,vector会自动扩容存储空间。
  2. vector中元素使用连续的存储空间,可以使用指针访问其元素,也可以使用
    偏移量访问存储空间中的元素。
  3. vector使用一个动态分配的连续存储空间来存储元素。在插入新元素时存储空间可能会被重新分配,这就意味着要耗费大量时间,因为分配一个新的存储空间会将所有元素移动到其中。因此,vector不会在每次向容器添加元素时重新分配。
  4. vector会分配一些额外的存储空间来适应可能的增长,因此容器的实际容量可能大于严格需要的存储容量(即容量的大小)。
  5. vector消耗更多的内存,以换取管理存储和以高效方式动态增长的能力。
  6. 定义于头文件 :template<
    class T,
    class Allocator = std::allocator
    > class vector;

vector使用注意点

如果需要频繁插入,最好先指定vector的大小,因为vector在容器大小不够用的时候会重新申请一块大小为原容器2/1.5倍的空间,并将原容器的元素拷贝到新容器中,并释放原空间,这个过程是十分耗时和耗内存的。

频繁对vector调用push_back()对性能的影响和原因

频繁调用push_back()会使得程序花费很多时间在vector扩容上,会变得很慢。这种情况可以考虑使用list

为什么vector每次以2倍扩容

vector 在插入新的元素时但是之前的内存已经满的时候需要扩容,在 VS 下是 1.5倍,在 GCC 下是 2 倍.采用成倍方式扩容,可以保证常数的时间复杂度,而增加指定大小的容量只能达到O(n)的时间复杂度,因此,使用成倍的方式扩容。

vector函数详解

构造函数

构造函数功能
vector();默认构造函数。构造拥有默认构造的分配器的空容器。
vector( size_type count );构造拥有个 count 默认插入的 T 实例的容器。不进行复制。
vector( size_type count, const T& value = T();构造拥有 count 个有值 value 的元素的容器。
vector( InputIt first, InputIt last);构造拥有范围 [first, last) 内容的容器
vector( const vector& other );复制构造函数。构造拥有 other 内容的容器。
vector( vector&& other );移动构造函数。用移动语义构造拥有 other 内容的容器。
vector( std::initializer_list init);构造拥有 initializer_list init 内容的容器。
vector& operator=( const vector& other );复制赋值运算符。以 other 的副本替换内容。
vector& operator=( vector&& other );移动赋值运算符。用移动语义以 other 的内容替换内容(即从 other 移动 other 中的数据到此容器中)。
vector& operator=( std::initializer_list ilist );以 initializer_list ilist 所标识者替换内容。
void assign( size_type count, const T& value );以 count 份 value 的副本替换内容。
template< class InputIt >
void assign( InputIt first, InputIt last );以范围 [first, last) 中元素的副本替换内容。
void assign( std::initializer_list ilist );以来自 initializer_list ilist 的元素替换内容。

#include <iostream>
#include <vector>
#include <iomanip>

using namespace std;

template<class T>
void Print(const vector<T>& vec)
{
	cout << "capacity:" << vec.capacity() << endl;
	cout << "size:" << vec.size() << endl;
	typename vector<T>::const_iterator it = vec.begin();

	for (; it != vec.end(); it++)
	{
		cout << setw(4) << *it;
	}

	cout << endl;
}

int main()
{
	int ar[] = { 1,2,3,4,5,6,7,8,9 };
	int n = sizeof(ar) / sizeof(ar[0]);

	vector<int> va;
	vector<int> vb(10);
	vector<int> vc(10,5);
	vector<int> vd(ar, ar + n);
	vector<int> ve(vd);
	vector<int> vf = { 1,2,3,4,5 };

	vector<string> vv = { "hello","world","This","is" };

	vector<string> vg;
	vector<string> vh;

	vg = vv;
	vh.assign(3, "This");

	Print(va);
	Print(vb);
	Print(vc);
	Print(vd);
	Print(ve);
	Print(vf);
	Print(vg);
	Print(vh);
	
	return 0;
}

在这里插入图片描述

迭代器

迭代器功能
iterator begin();返回指向 vector 首元素的迭代器。若 vector 为空,则返回的迭代器将等于 end() 。
iterator end();返回指向 vector 末元素后一元素的迭代器。
reverse_iterator rbegin();返回指向逆向 vector 首元素的逆向迭代器。它对应非逆向 vector 的末元素。若 vector 为空,则返回的迭代器等于 rend() 。
reverse_iterator rend();返回指向逆向 vector 末元素后一元素的逆向迭代器。它对应非逆向 vector 首元素的前一元素。
在这里插入图片描述

在这里插入图片描述

#include <iostream>
#include <vector>
#include <iomanip>

using namespace std;

template<class T>
void Print(const vector<T>& vec)
{
	cout << "capacity:" << vec.capacity() << endl;
	cout << "size:" << vec.size() << endl;
	typename vector<T>::const_iterator it = vec.begin();

	for (; it != vec.end(); it++)
	{
		cout << setw(4) << *it;
	}

	cout << endl;
}

int main()
{
	vector<string> va = { "Hello","World","This","Is" };
	
	Print(va);

	vector<string>::iterator s1 = va.begin();
	vector<string>::iterator s2 = va.end() - 1;
	vector<string>::const_reverse_iterator s3 = va.rbegin();
	vector<string>::const_reverse_iterator s4 = va.rend() - 1;

	cout << "va.begin():" << *s1 << endl;
	cout << "va.end():" << *s2 << endl;
	cout << "va.rbegin():" << *s1 << endl;
	cout << "va.rend():" << *s2 << endl;
	
	return 0;
}

在这里插入图片描述

容量函数

容量函数功能
bool empty() const;检查容器是否无元素,即是否 begin() == end() 。
size_type size() const;容器中的元素数量。
size_type max_size() const;返回根据系统或库实现限制的容器可保有的元素最大数量,即对于最大容器的 std::distance(begin(), end()) 。
size_type capacity() const;返回容器当前已为之分配空间的元素数。
void shrink_to_fit();请求移除未使用的容量。
void reserve( size_type new_cap );增加 vector 的容量到大于或等于 new_cap 的值。若 new_cap 大于当前的 capacity() ,则分配新存储,否则该方法不做任何事。reserve() 不更改 vector 的 size 。

#include <iostream>
#include <vector>

int main()
{
	vector<int> va = { 1,2,3,4,5,6,7,8,9 };
	
	cout << "va.empty():" << va.empty() << endl;
	cout << "va.max_size():" << va.max_size() << endl;
	cout << "va.size():" << va.size() << endl;
	cout << "va.capacity():" << va.capacity() << endl;

	return 0;
}

在这里插入图片描述

插入、删除、清除

函数功能
void clear();从容器擦除所有元素。此调用后 size() 返回零。
iterator insert( iterator pos, const T& value );在 pos 前插入 value 。
iterator insert( const_iterator pos, T&& value );在 pos 前插入 value 。
void insert( iterator pos, size_type count, const T& value )在 pos 前插入 value 的 count 个副本。
template< class InputIt >
void insert( iterator pos, InputIt first, InputIt last);在 pos 前插入来自范围 [first, last) 的元素。
iterator insert( const_iterator pos, std::initializer_list ilist );在 pos 前插入来自 initializer_list ilist 的元素。
iterator erase( iterator pos );移除位于 pos 的元素
iterator erase( iterator first, iterator last );移除范围 [first; last) 中的元素。
void push_back( const T& value );初始化新元素为 value 的副本。
void pop_back();移除容器的末元素
void resize( size_type count, T value = T() );重设容器大小以容纳 count 个元
void resize( size_type count );重设容器大小以容纳 count 个元
void swap( vector& other );将内容与 other 的交换。不在单独的元素上调用任何移动、复制或交换操作。

#include <iostream>
#include <vector>
#include <iomanip>

using namespace std;

template<class T>
void Print(const vector<T>& vec)
{
	cout << "capacity:" << vec.capacity() << endl;
	cout << "size:" << vec.size() << endl;
	typename vector<T>::const_iterator it = vec.begin();

	for (; it != vec.end(); it++)
	{
		cout << setw(4) << *it;
	}

	cout << endl;
}

int main()
{
	vector<int> va = { 1,2,3,4,5,6,7,8,9 };
	
	Print(va);

	va.clear();
	Print(va);

	va.insert(va.begin(), 11, 3);
	Print(va);

	return 0;
}

在这里插入图片描述

vector中的resize,reserve和assign函数的区别

void reserve( size_type new_cap );
reserve函数用来给vector预分配存储区大小,即capacity的值,但是没有给这段内存初始化。reserve的参数new_cap是推荐预分配内存的大小,实际分配的可能等于或小于这个值。
当调用函数时,new_cap的值如果大于capacity的值,就会重新分配内存,使得capacity的值大于 new_cap。这样,当调用push_back函数使得size超过原来的默认分配的capacity值时避免了内存重分配开销。
reserve函数分配出来的内存空间未初始化对象,只是表示vector可以利用这部分内存空间,但是vector不能有效地访问这些内存空间,如果访问的时候就会出现越界现象,导致程序崩溃。
void resize( size_type count );
void resize( size_type count, T value = T() );
resize函数重新分配大小,改变容器的大小,并且创建对象。
当count 小于当前size()的时候,vector首先会减少size()值保留前count个元素,然后将超出的元素删除。
当count大于当前size()值时候,vector 会插入相应数量的元素使得size(值达到n,并对这些元素进行初始化,如果
调用上面的第二个resize函数,指定val, vector 会用val来初始化这些新插入的元素。
当count大于capacity)值的时候,会自动分配重新分配内存存储空间。
void assign( size_ type n, const T&x );
void assign( Inputlt first, Inputlt last );
将n个值为x的元素赋值到vector容器中,或者将区间first,last)的元素赋值到当前的vector容器中,这个容器会清除掉vector容器中以前的内容。

元素访问函数

元素访问函数功能
reference at( size_type pos );返回位于指定位置 pos 的元素的引用,有边界检查。
reference operator[]( size_type pos );返回位于指定位置 pos 的元素的引用。
reference front();返回到容器首元素的引用。
reference back();返回到容器中最后一个元素的引用。
T* data();返回指向作为元素存储工作的底层数组的指针。

#include <iostream>
#include <vector>

int main()
{
	vector<int> va = { 1,2,3,4,5,6,7,8,9 };
	
	cout << "va.at(1):" << va.at(1) << endl;
	cout << "va[1]:" << va[1] << endl;
	cout << "va.front():" << va.front() << endl;
	cout << "va.back():" << va.back() << endl;
	cout << "*va.data():" << *va.data() << endl;
	
	return 0;
}

在这里插入图片描述

仿写

见下一篇

END!!!

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值