C++ STL之vector
vector简介
vector是C++中的一种类似数组的可改变大小的容器,位于头文件中。vector与数组相似,支持时间复杂度为O(1)的随机访问。但与数组不同的是,vector的大小是可以动态改变的。在vector的内部用动态分配的数组来存储数据元素。当vector的容量不足时,它将通过重新分配数组的方式实现动态扩容。由于vector重新分配内存的性能开销很大,所以vector会分配一些额外的空间。因此,vector的容量比它实际存储的数据元素的个数要多。事实上,vector的容量是以指数的形式增长的。例如,vector第一次分配的数组大小为1,第二次分配的数组大小为2,第三次分配的数组大小为4,第四次分配的数组大小为8……由于vector中的数据在内存中是顺序存储的,所以vector的元素也可以用只想其数组元素的常见指针的偏移量来访问。另外,vector支持快速的push和pop操作。
构造函数
- vector();
构造一个空的vector。 - vector(size_type n);
构造一个容量为n的vector。 - vector(size_type n, const value_type& val);
构造一个大小为n的vector,该vector中的每个元素的值都是val。 - vector(InputIterator first, InputIterator last);
构造一个vector存储一个容器中指定范围内元素。元素的范围由first和last两个迭代器指定。 - vector(const vector&);
复制一个vector。
运算符重载
vector& operator= (const vector& x);
将新内容分配给vector,替换掉原有的数据,并相应地调整大小。
迭代器函数
- iterator begin();
返回指向vector中第一个元素的迭代器。 - const_iterator begin() const;
返回指向vector中第一个元素的迭代器,vector是const限定的。 - iterator end();
返回指向vector最后一个元素的后一个元素的迭代器。 - iterator end() const;
返回指向vector最后一个元素的后一个元素的迭代器,vector是const限定的。 - reverse_iterator rbegin();
返回指向vector中最后一个元素的反向迭代器。 - reverse_iterator rbegin() const;
返回指向vector中最后一个元素的反向迭代器,vector是const限定的。 - reverse_iterator rend();
返回指向vector中第一个元素的前一个元素的反向迭代器。 - reverse_iterator rend() const;
返回指向vector中第一个元素的前一个元素的反向迭代器,vector是const限定的。 - const_iterator cbegin() const;
返回的const_iterator指向容器中第一个元素 。 - const_iterator cend() const;
返回的const_iterator指向容器中最后一个元素之后的一个元素。 - const_reverse_iterator crbegin() const;
返回一个const_reverse_iterator,指向容器中的最后一个元素。 - const_reverse_iterator crend() const;
返回一个const_reverse_iterator常量 ,该指向容器中第一个元素之前的理论元素。
容量函数
- size_type size() const;
返回vector中的元素的个数。 - size_type max_size() const;
返回vector最大可容纳的元素数量。 - void resize (size_type n);
将容器的大小设置为n。如果n小于当前容器的大小 ,则将内容减少到其前n个元素,并删除超出范围的元素。如果n大于当前容器的大小 ,则通过在末尾插入所需数量的元素来扩展内容,以达到大小 n 。如果n也大于当前容器容量 ,则会自动重新分配已分配的存储空间。 - void resize (size_type n, const value_type& val);
与void resize (size_type n);类似,但当n大于当前容器的大小时,补充val以达到n。 - size_type capacity() const;
返回分配存储容量的大小。 - bool empty() const;
测试vector是否为空,即vector的大小是否为0。 - void reserve (size_type n);
请求vector的容量至少可以容纳n个元素。 - void shrink_to_fit();
请求容器减小其容量以适合其大小。
元素访问函数
- reference operator[] (size_type n);
返回下标为n的元素的引用。operator[]不进行边界检查。 - const_reference operator[] (size_type n) const;
返回下标为n的元素的引用,该元素是const限定的。operator[]不进行边界检查。 - reference at (size_type n);
返回下标为n的元素的引用。如果下标越界,抛出out_of_range异常。 - const_reference at (size_type n) const;
返回下标为n的元素的引用,该元素是const限定的。如果下标越界,抛出out_of_range异常。 - reference front();
返回vector中的第一个元素的引用。 - const_reference front() const;
返回vector中的第一个元素的引用,该引用是const限定的。 - reference back();
返回vector中的最后一个元素的引用。 - const_reference back() const;
返回vector中的最后一个元素的引用,该引用是const限定的。 - value_type* data();
返回指向vector中第一个元素的指针。
10.const value_type* data() const;
返回指向vector中第一个元素的指针,该指针是const限定的,指向一个常量。
修改函数
- void assign(InputIterator first, InputIterator last);
将迭代器first和last指定的范围内的元素填入vector中。 - void assign (size_type n, const value_type& val);
将n个val填入vector中。 - void push_back (const value_type& val);
将val追加(复制或移动)到vector末尾,val是const限定的。 - void push_back (value_type&& val);
将val追加(复制或移动)到vector末尾。 - void pop_back();
删除vector中的最后一个元素。 - iterator insert (const_iterator position, const value_type& val);
将元素val插入迭代器所指向的元素之前,返回新的元素的迭代器,其中val是const限定的。 - iterator insert (const_iterator position, size_type n, const value_type& val);
将元素n个val插入迭代器所指向的元素之前,返回第一个新元素的迭代器。 - iterator insert (const_iterator position, InputIterator first, InputIterator last);
将迭代器first和last确定的若干元素插入到指定位置之前,并返回表示第一个新插入元素位置的迭代器。 - iterator insert (const_iterator position, value_type&& val);
将元素val插入迭代器所指向的元素之前,返回新的元素的迭代器。 - iterator erase (const_iterator position);
将指定位置的元素删除,返回该元素后一个元素的迭代器。 - iterator erase (const_iterator first, const_iterator last);
将由first和last迭代器确定的元素删除,并返回所删除的最后一个元素的后一个元素的迭代器。 - void swap (vector& x);
交换两个vector的内容。 - void clear();
清除vector中的所有内容,并将大小设置为0,但内存一般不会重新分配。 - iterator emplace (const_iterator position, Args&&… args);
在指定位置的元素前插入一个元素,args是该元素的构造函数的参数。 - void emplace_back (Args&&… args);
在vector末尾追加一个元素,args是这个元素的构造函数的参数。 - allocator_type get_allocator() const;
返回与vector关联的分配器对象的副本。
非成员函数
-
bool operator== (const vector<T,Alloc>& lhs, const vector<T,Alloc>& rhs);
-
bool operator!= (const vector<T,Alloc>& lhs, const vector<T,Alloc>& rhs);
-
bool operator< (const vector<T,Alloc>& lhs, const vector<T,Alloc>& rhs);
-
bool operator<= (const vector<T,Alloc>& lhs, const vector<T,Alloc>& rhs);
-
bool operator> (const vector<T,Alloc>& lhs, const vector<T,Alloc>& rhs);
-
bool operator>= (const vector<T,Alloc>& lhs, const vector<T,Alloc>& rhs);
按字典序比较两个vector。 -
void swap (vector<T,Alloc>& x, vector<T,Alloc>& y);
交换两个vector的内容。
vector<bool>
在vector<bool>中,vector对bool的空间进行了优化,每个bool的空间为1个bit。所以,从本质上讲,vector<bool>并不是一种容器。在vector<bool>中,operator[]并不返回一个bool的引用。 容器使用的指针和迭代器类型不一定是指针也不是符合要求的迭代器,尽管它们将模拟它们的大多数预期行为。因此并不建议在编程中使用vector<bool>。