Vector(向量容器)

Vector(向量容器)

Vector是一个线性顺序结构。相当于数组,但其大小可以不预定指定,并且自动扩展。它可以像数组一样被操作,由于它的特性我们完全可以将vector看作动态数组。在使用它时, 需要包含头文件include <vector>
在创建一个vector后,它会自动在内存中分配一块连续的内存空间进行数据存储,初始的空间大小可以预先指定也可以由vector默认指定,这个大小即 capacity() 函数的返回值。当存储的数据超过分配的空间时vector会重新分配一块内存,但这样的分配是很耗时的,在重新分配空间时它会做这样的动作:
首先,vector会申请一块更大的内存块;
然后,将原来的数据拷贝到新的内存块中;
其次,销毁掉原内存块中的对象(调用对戏那个的析构函数);
最后,将原来的内存空间释放掉。
如果vector保存的数据量很大时,这样的操作一定会导致糟糕的性能(这也是vector被设计成比较容易拷贝的值类型的原因)。所以说vector不是在什么情况下性能都好,只有在预先知道它大小的情况下vector的性能才是最优的。

Vector的特点

  1. 指定一块如同数组一样的连续存储,但空间可以动态扩展。即它可以像数组一样操作,并且可以进行动态操作。通常体现在push_back(),pop_bach()。
  2. 随机访问方便,它像数组一样被访问,即支持 [ ] 操作符和vector.at()。
  3. 节省空间,因为它是连续存储,在存储数据的区域都是没有被浪费的,但是要明确一点vector大多情况下并不是满存的,在未存储的区域实际是浪费的。
  4. 在内部进行插入、删除操作效率非常低,这样的操作基本上是被禁止的。Vector被设计成只能在后端进行追加和删除操作,其原因是vector内部的实现是按照顺序表的原理。
  5. 只能在vector的最后进行push和pop,不能在vector的头部进行push和pop。
  6. 当动态添加的数据超过vector默认分配的大小时要进行内存的重新分配、拷贝与释放,这个操作非常消耗性能。所以要vector达到最优的性能,最好在创建vector时就指定其空间大小。

Vector包含着一系列连续存储的元素,其行为和数组类似。访问Vector中的任意元素或从末尾添加元素都可以在常量级时间复杂度内完成,而查找特定值的元素所处的位置或是在Vector中插入元素则是线性时间复杂度。

1、Constructors 构造函数

   vector<int> v1; //构造一个空的vector
   vector<int> v1(5,42); // 构造了一个包含5个值为42的元素的vector

2、Operators 对vector进行赋值或比较

C++ Vector能够使用的标准运算符:==,!=,<=,>=,<和>。
要访问vector中的某特定位置的元素可以使用[]操作符。
连个vector被认为是相等的,如果:它们具有相同的容量;所有相同位置的元素相等。
Vector之间大小的比较是按照词典规则。

3、assign() 对Vector中的元素赋值

void assign(input_iterator start, input_iterator end); //将区间[start,end)的元素复制到当前vector;
void assign(size_type num, const TYPE &val);//赋num个值为val的元素到vector中,这个函数将会清除掉为vector赋值以前的内容;

4、at() 返回指定位置的元素

TYPE at(size_type loc); //差不多等同于v[i];但比v[i]安全;

5、back() 返回最末一个元素
6、begin() 返回第一个元素的迭代器
7、capacity() 返回vector所能容纳的元素数量(在不重新分配内存的情况下)
8、clear() 清空所有元素
9、empty() 判断vector是否为空(返回true时为空)
10、end() 返回最末元素的迭代器(实际指向最末元素的下一个位置)
11、erase() 删除指定元素

iterator erase(iterator loc); // 删除loc处的元素
iterator erase(iterator start, iterator end); //删除start和end之间的元素

12、front() 返回第一个元素的引用
13、get_allocator() 返回vector的内存分配器
14、insert() 插入元素到vector中

iterator insert(iterator loc, const TYPE &val);//在指定位置loc前插入值为val的元素,返回指向这个元素的迭代器
iterator insert(iterator loc, size_type num, const TYPE &val);/在指定位置loc前插入num个值为val的元素
void insert(iterator loc,input_iterator strat, input_iterator end);//在指定位置loc前插入区间[start, end)的所有元素

15、max_size() 返回vector所能容纳元素的最大数量(上限)
16、pop_back() 移除最后一个元素
17、push_back() 在vector最后添加一个元素
18、rbegin() 返回vector尾部的逆迭代器
19、rend() 返回vector首部的逆迭代器
20、reserve() 设置vector最小的元素容纳数量
//为当前vector预留至少工容纳size个元素的空间
21、resize() 改变vector元素数量的大小

void resize(size_type size, TYPE val);//改变当前vector的大小为size,且对新创建的元素赋值val

22、size() 返回vector元素数量的大小
23、swap() 交换两个vector

void  swap(vector & from);

猜你喜欢

转载自blog.csdn.net/baidu_34884208/article/details/86906082