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( 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 
#include 
#include 

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;
}

C++中STL---vector详解_第1张图片

迭代器

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

C++中STL---vector详解_第2张图片

#include 
#include 
#include 

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;
}

C++中STL---vector详解_第3张图片

容量函数

容量函数 功能
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 
#include 

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 
#include 
#include 

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;
}

C++中STL---vector详解_第4张图片

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 
#include 

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;
}

C++中STL---vector详解_第5张图片

仿写

见下一篇

END!!!

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