当前位置:   article > 正文

C++ vector详解使用 【建议收藏】

C++ vector详解使用 【建议收藏】

一、类函数

说明: reference代指元素的引用,比如 int&。iterator指代迭代器。Args… args是可变参数模板的内容。

作用函数描述
将值赋给容器void assign(iterator first, iterator last )以范围 [first, last) 中元素的副本替换内容。
访问指定的元素,同时进行越界检查reference at( int pos )返回位于指定位置 pos 的元素的引用,有边界检查,越界抛出异常。
访问指定的元素reference operator[]( size_type pos )返回位于指定位置pos 的元素的引用。不进行边界检查。
访问第一个元素reference front()返回到容器首元素的引用。
访问最后一个元素reference back()返回到容器中最后一个元素的引用。
返回底层数组T* data()返回指向作为元素存储工作的底层数组的指针。
判断是否为空bool empty()检查容器是否无元素。若为空,返回true。否则,返回false。
返回元素个数int size()返回容器中的元素数
返回可容纳的最大元素个数int max_size()基本上返回的是大小为千万或亿级的整数。
返回预留的存储空间大小void reserve( size_type new_cap )增加 vector 的容量
返回当前存储空间能够容纳的元素数int capacity()返回容器当前已为之分配空间的元素数,即容量。
释放为使用的内存,减少内存使用void shrink_to_fit()请求移除未使用的容量
清空元素void clear()从容器擦除所有元素。此调用后 size() 返回零。
在指定位置插入元素insert(iterator pos, const T& value )插入元素到容器中的指定位置
原地构造元素emplace(iterator pos, Args&&… args )直接于pos 前插入元素到容器中
删除指定位置元素erase( iterator pos )移除位于 pos 的元素
添加元素void push_back( const T& value )将元素添加到容器末尾
在容器末尾就地构造元素void emplace_back( Args&&… args )添加新元素到容器尾
移除元素void pop_back()移除容器的末元素
改变容器中可存储元素的个数void resize( int count )重设容器大小以容纳 count 个元素
交换两个vector的内容void swap( vector& other )将内容以及容量与 other 的交换。

注意:函数给出的只是基本使用,并且函数原型进行简化了,很多模板参数没给,还有部分函数没给返回值,说明日常使用中一般忽略。

二、初始化

// 1. 无参,默认大小为0
vector<int> a;
// 2. 指定大小
vector<int> b(5);  // 在b中初始化5个默认值为0的元素
// 3. 指定大小和初始值
vector<int> c(10, 1);
// 4. 借助数组初始化
int arr[4] = {1,2,3,4};
vector<int> d(arr, arr+4);  // 左闭右开, 不包括arr[4],当然也不存在arr[4](越界), 即有arr[0], arr[1], arr[2], arr[3]
// 5. 直接拷贝构造其他 vector
vector<int> f1(d);
// 6. 借助迭代器(左闭右开)
vector<int> f2(d.begin(), d.end());
vector<int> f2(d.begin(), d.begin()+2);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

三、遍历

3.1 索引遍历

vector<int> nums{1, 2, 3, 4, 5, 6};
for(int i = 0; i < nums.size(); i++)
        cout << nums[i] << " ";
    cout << endl;
  • 1
  • 2
  • 3
  • 4

3.2 迭代器遍历

for (auto it = nums.begin(); it != nums.end(); it++)
        cout << *it << " ";
cout << endl; 
  • 1
  • 2
  • 3

3.3 直接遍历元素

for (auto item : nums)
        cout << item << " ";
cout << endl; 
  • 1
  • 2
  • 3

四、常见操作

假设有vector<int>类型的变量,nums

vector<int> nums

4.1 返回最大值

*max_element(nums.begin(), nums.end()) 。需要引入头文件 #include <algorthim>

4.2 返回最小值

*min_element(nums.begin(), nums.end()) 。需要引入头文件 #include <algorthim>

4.3 升序排序

sort(nums.begin(), nums.end()) 。需要引入头文件 #include <algorthim>

4.4 降序排序

sort(nums.rbegin(),nums.rend())。需要引入头文件 #include <algorthim>

4.5 反转vector

reverse(nums.begin(), nums.end())。需要引入头文件 #include <algorthim>

4.6 去除重复元素

// 方式一:借助集合 set 的自动去除 需要引入头文件 #include <set>
set<int> st(nums.begin(), nums.end());
nums.assign(st.begin(), st.end());

// 方式二:借助 unique 函数 需要引入头文件 #include <algorthim>
sort(vec.begin(), vec.end());
vec.erase(unique(vec.begin(), vec.end()), vec.end());
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

方法二解释:
(1)unique函数作用?

unique()函数将相邻且重复的元素放到vector的尾部 然后返回指向第一个重复元素的迭代器。
然后借助erase删除重复元素(erase函数可以区间删除,上面没说,只说了基本的删除固定位置的元素)。

(2)为什么先排序?

先排序,因为unique函数要求数组有序。估计unique内部使用的快慢指针,能在时间复杂度为 O ( n ) O(n) O(n)的范围内将所有重复元素移到尾部.

注意:两种方法都不能保证vector元素间的相对顺序不变。去重后,vector升序排列。

4.7 初始化 m*n大小 的二维vector

vector<vector<int>> (m, vector<int>(n))

4.8 拷贝赋值

new_vector.assign(old_vector.begin(), old_vector.end())
注意:对于二维vector的拷贝,此方法亦可。

4.8 交换vector

vector1.swap(vector2)
注意:对于二维的vector也适用。

五、可能存在的疑惑

5.1 迭代器是什么?

迭代器是一种类模板,可以简单的看成是“指针”。

5.2 元素个数和容量的区别(size()和capacity())

举个例子。你的任务(vector)是用杯子装水,元素个数size()就是你装了几杯水。容量capacity()是你有几个杯子,包括已经装水的杯子和空杯子。

也就是说 c a p a c i t y > = s i z e capacity >= size capacity>=size

5.3 vector.end()返回的迭代器的指向?

vector.end() 返回指向vector的最后一个元素的下一个 位置的迭代器,是没有元素存放的。

所有当用迭代器it遍历时,当it == vector.end() 时结束遍历。

六、参考

vector的几种初始化及赋值方式

std::vector - cppreference.com

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/174637
推荐阅读
  

闽ICP备14008679号