目录:
Constructor
Types
Methods
vector整体赋值
访问vector单一元素
获得vector迭代器和指针
获得vector大小
增删vector元素
tips:放入容器的元素类型必须实现默认构造函数,拷贝构造函数,赋值函数
std::Vector
#include<vector>
Constructor:
vector<T> ( )
创建空vector,不为元素预分配内存
vector<T>(size_type n)
调用T()创建一个临时对象,然后利用T的拷贝构造函数T(T&)为vector创建n个对象
vector<T>(size_type n,const T& initValue)
利用T的拷贝构造函数创建n个对象
注意:如果initValue参数不是T类型变量,编译器会寻找是否存在T(value_type(initValue) )构造函数,如果存在则先调用该函数生成一个临时变量。不推荐该用法,可用explicit关键字关闭隐式的类型转换,即在单参数构造函数前增加explicit关键字。
vector<T>(ForwardIteratorstart,ForwardIterator end)
利用T的拷贝构造函数创建(difference_type)(end-start)个元素,其值与[start, end)对应相等
注意:如果value_type(*start)不为T,如果存在T (value_type(*start) )构造函数,则将调用该构造函数来创建元素,不存在则报错。该用法不推荐使用。
vector<T>(constvector<T>& v)
利用T的拷贝构造函数创建一个与v大小相等,值对应相等的vector
Types:
vector<T>::allocator_type:空间配置器类型,
vector<T>::const_iterator:常量迭代器类型
vector<T>::const_pointer: 常量指针类型
vector<T>::const_reference: 常量引用类型
vector<T>::const_reverse_iterator:常量反向迭代器类型
vector<T>::difference_type:元素间距类型
vector<T>::reverse_iterator:反向迭代器类型
vector<T>::size_type:元素数量类型
vector<T>::value_type:元素值类型
Methods:
vector整体赋值:
vector& operator=(const vector& rhs);
vector的赋值函数,当rhs为本vector时,不进行任何操作返回
当this->capacity不小于rhs.capacity时,析构所有元素,然后调用赋值函数(有可能还需调用拷贝构造函数)拷贝rhs元素
当小于时,分配新的空间,调用拷贝构造函数拷贝rhs元素,并析构原空间元素并释放空间
void assign(size_type n, const T& value)
void assign(InputIterator start, InputIteratorend)
执行结果类似具有相同参数的构造函数
当n或者(difference_type)(end-start)大于vector已有元素个数时,释放原有空间,在新分配的空间调用拷贝构造函数创建新元素。
当不大于原有元素个数时,在现有空间上调用赋值函数创建新元素,并析构多余元素。
注意:是析构多余元素,而不会释放多余空间,实际上vector的空间只增不减,因为vector存放数据的空间只能整块释放,无法释放部分空间 。
void swap(vector<Type,Allocator>& _Right);
friend void swap(vector<Type,Allocator >& _Left,
vector<Type, Allocator >&_Right);
交换vector元素,实质上只需要交换vector内指示元素位置范围的变量(一般是迭代器或指针),执行时间为O(1)
访问vector单一元素
referenceat(size_type pos)
const_referenceat(size_type pos) const
返回pos位置指示的元素引用,如果pos错误会抛出异常std::out_of_range
reference operator[](size_type pos)
const_referenceoperator[](type pos) const
功能与at( )相似,但operator[]在下标越界时行为未定义,但不会抛出异常,使用前应确保下标范围合法。
reference back( );
const_reference back( )const
返回最后位置元素的引用,vector为空时行为未定义,使用前应先确保vector非空。
reference front( );
const_reference front( )const;
返回第一个元素的引用,vector为空时行为未定义,使用前应先确保vector非空
获得vector迭代器和指针
const_iterator begin()const;
iterator begin();
返回第一个元素的随机访问迭代器,vector为空则与end( )返回的值相等
注意:const_iterator是指迭代器所指元素只读,迭代器本身是可写的。
iterator end( );
const_iterator end( )const;
返回一个标示vector最后位置之后的随机访问迭代器(- - itr即是标示vector最后一个元素的迭代器),表示vector结束
reverse_iterator rbegin();
const_reverse_iteratorrbegin( ) const;
返回标示vector最后一个元素的反向迭代器,该迭代器行为与正向迭代器行为相反,++操作使迭代器指向vector当前元素的前一个元素,- -操作使迭代器指向vector当前元素的下一个元素。vector为空则与rend( )返回的值相同
const_reverse_iteratorrend( ) const;
reverse_iterator rend( );
返回标示vector第一个元素之前位置的反向迭代器
const_pointer data() const;
pointer begin();
返回指向vector第一个元素的指针,vector为空的话则返回NULL
获得vector大小
size_type capacity( ) const;
返回vector可容纳的元素个数
注意:出于效率考虑,vector会在操作遭遇内存不足时预分配超过当时所需数量的内存,一般是max(oldSize*2 , oldSize+needSize)。capacity返回的即是(分配的内存/单个元素大小)
size_type size( ) const;
返回vector包含的元素个数
注意:size的执行时间为O(1),所以C++代码中常直接将其放在for循环里,而不是在循环外用某个变量获取其返回值使用。
size_type max_size( ) const;
返回vector能达到的最大长度
注意:实际上因为内存限制等因素,vector能容纳的元素个数小于这个值
bool empty( ) const;
判断vector是否为空,空返回true,否则为false
void reserve(_type newCount);
调整vector分配的空间到newCount
如果newCount小于oldCount,不进行任何操作
如果大于oldCount,分配能容纳newCount个元素的新空间并将原有元素拷贝到新空间,然后析构原有空间元素并释放内存
注意:出于效率考虑,vector不会减小分配的内存
增删vector元素
void clear( );
调用vector内元素的析构函数释放元素对象,但是保留分配的内存
注意:vector的空间只增不减
iterator erase(const_iterator_Where);
iterator erase(const_iterator _First, const_iterator_Last);
如果指定元素位于vector尾部,调用元素的析构函数释放对象
否则调用赋值函数用后面的元素覆盖待删除元素,然后调用析构函数释放后面的元素
返回值为标示被删除元素下一位置元素的迭代器,被删除后的vector为空则与end( )返回的迭代器相等。在vector容器中实质上就是返回了第一个被删除元素的迭代器。
注意:保留分配的内存不释放
void resize( size_type Newsize );
void resize( size_type Newsize, Type val );
将vector.size调整到给定大小
如果没给初始值val,会先调用默认构造函数生成一个临时对象。
如果newSize大于oldSize,则用拷贝构造函数构造(newSize-oldSize)个新元素(空间不够的话需要先分配新空间,拷贝原来空间元素,然后在新空间构造新元素,最后析构原有空间元素并释放空间)
如果等于原来的size,不执行操作(实际上也调用默认构造函数创建了一个临时对象然后析构了)
如果newSize小于oldSize,析构后面的(oldSize-newSize)个元素,但空间不释放
iterator insert(const_iterator pos, const Type& value);
void insert(const_iterator pos, size_type n, const Type& value);
template<class InputIterator>
void insert(const_iterator pos, InputIterator start, InputIterator );
如果插入位置在尾部,有足够预留空间的话就直接调用拷贝构造函数创建新元素;没有足够空间的话就先分配新空间,然后利用拷贝构造函数将原有元素和待插入元素拷贝到新空间并析构原有空间元素,释放原有空间内存。
如果插入位置不在尾部,有足够预留空间的话就先调用拷贝构造函数(经常还需要用到赋值函数)将待插入位置范围的元素往后移动,然后调用赋值函数插入新元素;没有足够空间的话就先分配新空间,再调用拷贝构造函数并释放原有空间内存。
返回值为标示新插入元素的迭代器。
注意:insert(start,end)方法中,如果指示待插入元素的是本vector的迭代器,则可能产生非法行为。
当待插入元素在插入点之前时,执行结果正常
当待插入元素在插入点之后时,如果需要重新分配空间,执行结果正常,如果预留空间足够,则会产生错误结果,插入错误的元素。
所以,insert( start, end)方法中应禁止传入本vector的迭代器。
void pop_back( );
删除vector最后一个元素,当vector为空时,行为未定义,使用前确保vector非空。
void push_back(const T& Val);
利用拷贝构造函数在vector尾部添加新元素
如果没有空间则先分配新空间,利用拷贝构造函数将原空间元素拷贝过去,然后在尾部构造新元素,最后析构原有空间元素并释放内存。
Allocator get_allocator( ) const;
返回vector使用的空间配置器