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

目录

  • 一、类函数
  • 二、初始化
  • 三、遍历
    • 3.1 索引遍历
    • 3.2 迭代器遍历
    • 3.3 直接遍历元素
  • 四、常见操作
    • 4.1 返回最大值
    • 4.2 返回最小值
    • 4.3 升序排序
    • 4.4 降序排序
    • 4.5 反转vector
    • 4.6 去除重复元素
    • 4.7 初始化 m*n大小 的二维vector
  • 五、可能存在的疑惑
    • 5.1 迭代器是什么?
    • 5.2 元素个数和容量的区别(size()和capacity())
    • 5.3 vector.end()返回的迭代器的指向?
  • 六、参考

一、类函数

说明: 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);

三、遍历

3.1 索引遍历

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

3.2 迭代器遍历

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

3.3 直接遍历元素

for (auto item : nums)
        cout << item << " ";
cout << endl; 

四、常见操作

假设有vector类型的变量,nums

vector nums

4.1 返回最大值

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

4.2 返回最小值

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

4.3 升序排序

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

4.4 降序排序

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

4.5 反转vector

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

4.6 去除重复元素

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

// 方式二:借助 unique 函数 需要引入头文件 #include 
sort(vec.begin(), vec.end());
vec.erase(unique(vec.begin(), vec.end()), vec.end());

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

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

(2)为什么先排序?

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

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

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

vector> (m, vector(n))

五、可能存在的疑惑

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

你可能感兴趣的:(c++,开发语言,数据结构)