C++ 中 vector 的常用操作方法汇总

 更新时间:2024年10月18日 09:54:22   作者:XuanRanDev  
在C++的STL中,vector是一个动态数组,可以在运行时调整大小,本文介绍了vector的初始化、元素访问、修改、迭代器操作、容量管理以及性能优化技巧,通过这些操作,可以有效地使用vector管理数据,本文介绍C++  vector 操作,感兴趣的朋友一起看看吧

在 C++ 中,vector 是 STL(标准模板库)提供的一个动态数组容器,允许我们在运行时动态调整大小。vector 提供了许多方便的操作,使得它成为管理数据的理想选择。在这篇博客中,我们将探讨 vector 的一些常用操作方法,并提供一些拓展知识,帮助你更好地理解和使用这一强大的数据结构。

1. 初始化和赋值

1.1 默认构造函数

vector<int> v1;

创建一个空的 vector

1.2 指定大小和初值

vector<int> v2(5, 10);

创建一个包含 5 个元素的 vector,每个元素的初始值为 10。

1.3 使用列表初始化

vector<int> v3 = {1, 2, 3, 4, 5};

使用初始值列表来构造 vector

1.4 拷贝构造函数

vector<int> v4(v3);

使用现有的 vector 进行拷贝构造。

2. 访问元素

2.1 使用 [] 操作符

int val = v3[2];

直接通过索引访问元素,但不检查边界。

2.2 使用 at() 函数

int val = v3.at(2);

[] 类似,但 at() 会检查索引是否合法,超出范围会抛出异常。

2.3 获取第一个和最后一个元素

int first = v3.front();
int last = v3.back();

2.4 获取指向数据的指针

int* data_ptr = v3.data();

获取 vector 中元素存储数组的指针。

3. 修改元素

3.1 添加元素

3.1.1 使用 push_back()

v3.push_back(6);

vector 的末尾添加一个元素。

3.1.2 使用 emplace_back()

v3.emplace_back(7);

在末尾原地构造一个元素,避免不必要的拷贝。

3.2 删除元素

3.2.1 使用 pop_back()

v3.pop_back();

移除 vector 末尾的元素。

3.2.2 使用 erase()

v3.erase(v3.begin() + 2);

移除指定位置的元素。

3.2.3 使用 clear()

v3.clear();

清空 vector 中的所有元素。

4. 迭代器操作

4.1 使用迭代器遍历

for (vector<int>::iterator it = v3.begin(); it != v3.end(); ++it) {
    cout << *it << " ";
}

4.2 使用范围 for循环

for (int val : v3) {
    cout << val << " ";
}

4.3 使用反向迭代器

for (vector<int>::reverse_iterator rit = v3.rbegin(); rit != v3.rend(); ++rit) {
    cout << *rit << " ";
}

5. 容量管理

5.1 使用 size() 和 capacity()

size_t size = v3.size();
size_t capacity = v3.capacity();

size() 返回 vector 中的元素个数,capacity() 返回当前分配的存储空间大小(可以容纳的元素个数)。

5.2 使用 reserve()

v3.reserve(10);

预先分配至少能容纳 10 个元素的空间。

5.3 使用 resize()

v3.resize(8, 0);

vector 的大小调整为 8,如果新大小大于当前大小,多出的元素将使用 0 进行初始化。

6. 性能优化技巧

6.1 避免不必要的拷贝

在插入元素时,尽量使用 emplace_back() 而不是 push_back(),可以减少一次对象的拷贝构造。

6.2 使用 shrink_to_fit()

v3.shrink_to_fit();

将多余的容量释放,减少内存占用。

6.3 避免过度扩展

在已知 vector 大小大致范围时,提前使用 reserve() 分配足够的空间,避免扩展时频繁的内存分配。

7. 拓展知识

7.1 vector 的内存管理

vector 使用的是动态数组来管理元素。当需要扩展时,它会分配一个更大的内存块,将原有元素拷贝过去。为了避免频繁的内存分配,vector 通常会预留比实际需要更多的空间,这就是 capacity()size() 之间的差异。

7.2 异常安全性

vector 的许多操作,如 push_back()resize() 等,可能会分配新的内存并移动对象。因此,在操作 vector 时要考虑异常安全性。大多数情况下,vector 提供的是“强异常安全保证”,即如果发生异常,容器的状态不会被破坏。

7.3 与原始数组的比较

vector 提供了动态调整大小、自动管理内存和许多便利的操作,而原始数组则更为简单且性能稍高。在需要高效内存使用的地方,可以考虑使用 std::array 或原始数组,但在大多数情况下,vector 是更安全和灵活的选择。

到此这篇关于C++ 中 vector 的常用操作方法的文章就介绍到这了,更多相关C++ vector 操作内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++二叉搜索树BSTree使用详解

    C++二叉搜索树BSTree使用详解

    二叉搜索树(Binary Search Tree)又称二叉排序树,也称作二叉查找树它或者是一棵空树,或者是具有以下性质的二叉树,若它的左子树不为空,则左子树上所有节点的值都小于根节点的值,若它的右子树不为空,则右子树上所有节点的值都大于根节点的值
    2023-03-03
  • 成员函数的重载、覆盖与隐藏详细解析

    成员函数的重载、覆盖与隐藏详细解析

    成员函数的重载、覆盖(override)与隐藏很容易混淆,C++程序员必须要搞清楚概念,否则错误将防不胜防
    2013-10-10
  • C++ boost库的安装过程详解

    C++ boost库的安装过程详解

    这篇文章主要介绍了C++ boost库的安装过程详解,文中通过示例代码和图片介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • vscode调试gstreamer源码的详细流程

    vscode调试gstreamer源码的详细流程

    在本文中主要介绍了如何使用vscode调试C++和python程序,并进一步分析了如何调试gstreamer源码,讲述了如何调试gstreamer源码的具体流程,感兴趣的朋友跟随小编一起看看吧
    2023-01-01
  • C++Node类Cartographer开始轨迹的处理深度详解

    C++Node类Cartographer开始轨迹的处理深度详解

    这篇文章主要介绍了C++Node类Cartographer开始轨迹的处理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-03-03
  • C++静态成员变量和静态成员函数的使用方法总结

    C++静态成员变量和静态成员函数的使用方法总结

    下面小编就为大家带来一篇C++静态成员变量和静态成员函数的使用方法总结。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • Qt项目实战之方块游戏的实现

    Qt项目实战之方块游戏的实现

    这篇文章主要为大家详细介绍了如何利用Qt实现简易的方块游戏,文中的示例代码讲解详细,具有一定的参考价值,感兴趣的小伙伴可以了解一下
    2023-03-03
  • C++存储链接性原理详解

    C++存储链接性原理详解

    这篇文章主要为大家介绍了C++存储链接性原理详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • C语言分支和循环详解

    C语言分支和循环详解

    C语言是一门结构化的程序设计语言,当C语言用来描述生活中的事物时,会用到三种结构:顺序结构(不去赘述),选择结构(对应分支语句),循环结构(对应循环语句),分支语句:分支语句分为两种,一种是if语句,一种是switch语句
    2021-10-10
  • C++实现LeetCode(159.最多有两个不同字符的最长子串)

    C++实现LeetCode(159.最多有两个不同字符的最长子串)

    这篇文章主要介绍了C++实现LeetCode(159.最多有两个不同字符的最长子串),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07

最新评论