C++中STL—vector详解
vector介绍
- vector是表示可变大小的数组的序列容器,当vector元素数量超过已有的vector数量时,vector会自动扩容存储空间。
- vector中元素使用连续的存储空间,可以使用指针访问其元素,也可以使用
偏移量访问存储空间中的元素。
- vector使用一个动态分配的连续存储空间来存储元素。在插入新元素时存储空间可能会被重新分配,这就意味着要耗费大量时间,因为分配一个新的存储空间会将所有元素移动到其中。因此,vector不会在每次向容器添加元素时重新分配。
- vector会分配一些额外的存储空间来适应可能的增长,因此容器的实际容量可能大于严格需要的存储容量(即容量的大小)。
- vector消耗更多的内存,以换取管理存储和以高效方式动态增长的能力。
- 定义于头文件 :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;
}
迭代器
迭代器 |
功能 |
iterator begin(); |
返回指向 vector 首元素的迭代器。若 vector 为空,则返回的迭代器将等于 end() 。 |
iterator end(); |
返回指向 vector 末元素后一元素的迭代器。 |
reverse_iterator rbegin(); |
返回指向逆向 vector 首元素的逆向迭代器。它对应非逆向 vector 的末元素。若 vector 为空,则返回的迭代器等于 rend() 。 |
reverse_iterator rend(); |
返回指向逆向 vector 末元素后一元素的逆向迭代器。它对应非逆向 vector 首元素的前一元素。 |
在这里插入图片描述 |
|
#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;
}
容量函数
容量函数 |
功能 |
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;
}
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;
}
仿写
见下一篇
END!!!