【总集】C++ STL类库 vector 使用方法

介绍:

1.vector 的中文名为向量,可以理解为一个序列容器,里面存放的是相同的数据结构类型,类似于数组但与数组又有微妙的不同。

2.vector 采用的是连续动态的空间来存储数据,它是动态的数组,它不仅可以使用下标访问每一个位置的数据,还可以对它的长度进行改变,十分的灵活。但是它的灵活也是有代价的,我们都知道,数组在内存中的长度是开始声明的时候就已经确定好了,要改变长度,就意味着需要重新的去申请空间,再将需要的元素移动到这个空间中,在释放原来的空间,但是 vector 对内存的处理或许并不是这样的,无论我们加多少个值或是删除多少个值来改变 vector 的 size,vector 的头地址始终是不变的,这可能和它的内部实现有关,在这里我也不追究了。

3.vector 同时也有许多的函数方法可以调用,方便我们的数据处理以及内存空间的管理。

4.vector 与其他的序列容器相比 (list, forward_lists, deque 等),vector 适合于随机的访问元素,在需要很多随机增删操作的情况下,或许 vector 就没有那么的好用了。

5.vector 在大多数的情况下还是作为动态来使用,一般用来求解线性的题目。

主要的函数方法以及实例化:

首先需要包含头文件 <vector>

实例化一个 vector:因为 vector 是一个模板类,在实例化的同时我们需要给出数据类型。如:

std::vector<int>v1;//实例化一个存放 int 型数据的 vector,其 size() 为 0,初始值为 0;

std::vector<int>v2(5,1);//实例化一个 size() 为 5 的 vector,且数据的初始值为 1;

std::vector<int>v3(v2);//实例化一个与 v2 相同的 vector,而且可以使用迭代器或数值来确定一个范围。

std::vector<int>v3 = v2;//同上

如果代码中包含了 using namespace std; 则可以不写 std:: 前缀。

1.访问元素操作:

  • 下标访问:v2[3], v3[4], v1[5];//其中 v1[5] 是错误的,因为下标越界了。
  • 使用 at():v2.at(0), v3.at(5);//虽然 v3.at(5) 是错误的,但是会抛出异常。
  • 访问头元素:v2.front();//返回值 int
  • 访问最后一个元素:v3.back();//返回值 int
  • 返回一个指针:int* p = v1.data();//返回一个指向这个数组的指针

2.容量操作:

  • vector 大小:v1.size();//返回 v1 的大小
  • vector 最大容量:v2.max_size();//返回 vector 的最大容量
  • vector 的真实大小:v3.capacity();//返回 v3 在内存中的真实大小
  • 改变 vector 的大小:v1.resize(int);//重新定义 v1 大小
  • 判断 vector 是否为空:v1.empty();//返回一个 bool 值
  • 把 vector 的大小减少到元素存储空间的大小:v2.shrink_to_fit();//使用 shrink_to_fit() 会释放内存,而 erase() 和 clear() 不会释放内存,可以减少内存的占用。

3.修改操作:

  • 末尾添加元素:v1.push_back(val);//返回空值
  • 末尾删除元素:v1.pop_back();//返回空值
  • 任意位置插入元素:v2.insert(val);//可以是一个范围,返回值为一个迭代器
  • 任意位置删除元素:v2.erase();//可以是一个范围或是一个位置,返回值为一个迭代器
  • 交换两个 vector 里的元素:v3.swap(v2);//返回空值
  • 多个元素赋值:v1.assign(5,3);//用于初始化 vector,表示 v1 初始化为 5 个值为 3 的元素;
  • 清空 vector:v3.clear();//返回空值
  • 末尾添加元素:v1.emplace_back();//相等于 push_back(),但比它更有效率(C++11)
  • 任意位置插入元素:v1.emplace();//相等于 insert(),但比它更有效率(C++11)

emplace_back() 能够通过参数构造对象,不需要拷贝或者移动内存,相比于 push_back() 能更好地避免内存的拷贝与移动,使容器插入元素的性能得到进一步提升。由此,在大多数情况下应该优先使用 emplace_back() 来代替 push_back()。

4.迭代器:

  • 开始位置:v1.begin();
  • 末尾位置:v1.end();
  • 指向常量的开始位置:v1.cbegin();//意思是不能通过这个迭代器来修改所指的内容(C++11)
  • 指向常量的末尾位置:v1.cend()://但可以通过其他方式修改的,而且迭代器也是可以移动的(C++11)

5.常用算法:

翻转 vector:reverse(v1.begin(),v1.end());

对 vector 进行排序:sort(v1.begin(),v1.end());//从小到大

sort(v1.begin(),v1.end(),Comp);//从大到小

copy(v1.begin(),v1.end(),v2.begin()+1);//把从 v1[0] 到 v1[size()-1] 的数据复制到 v2[1] 中

find(v1.begin(),v1.end(),10);//在 v1[0] 到 v1[size()-1] 中寻找值为 10 的数

几个函数调用的实例:

v1.assign(v2.begin(),v2.begin()+3);
v1.assign(5,3);
v1.front();
v1.back();
vector<int>::iterator=v1.begin();
vector<int>::iterator=v1.end();
v1.at(3);
v1.empty();
v1.clear();
v1.push_back(5);
v1.emplace_back(5);
v1.insert(v1.begin()+1,5);//在v1的第一个位置插入值为5的数据
v1.insert(v1.begin()+1,3,5);//在v1的第一个位置插入3个值为5的数据
v1.insert(v1.begin()+1,v2.begin(),v2.end());//在v1的第一个位置插入v2
v1.emplace(v1.begin(),5);//在v1的头部插入值为5的数据
v1.pop_back();
v1.erase(v1.begin()+3);
v1.erase(v1.begin()+1,v1.begin()+3);
v1.size(5);
v1.resize(10);
v1.resize(10,6);//假如v1原来为{1,2,3,4,5},执行代码后为{1,2,3,4,5,6,6,6,6,6}
v1.capacity();
v1.swap(v2);
v1==v2;
v1=v2;
v1>v2;
v1<v2;
v1[4];
sort(v1.begin(),v1.end());
reverse(v1.begin(),v1.end());
copy(v1.begin(),v1.end(),v2.begin()+1);
find(v1.begin(),v1.end(),10);

提醒一下:迭代器 v1.begin() 到 v1.end() 的范围是 v1[0] 到 v1[v1.size()-1]。例如假设:v1.size()=5,则 v1.begin() 到 v1.end() 的范围是  v1[0] 到 v1[4],它是一个左闭右开的区间。

posted @ 2019-03-16 15:11  1000sakura  阅读(595)  评论(0编辑  收藏  举报