C++中std::vector的具体使用

 更新时间:2025年02月18日 09:53:42   作者:木宇(记得热爱生活)  
C++标准库中的std::vector是一种动态数组容器,适用于算法竞赛中的动态数据存储、数组扩展和模拟栈/二维数组等场景,本文就来介绍一下,感兴趣的可以了解一下

在 C++ 标准库中,std::vector 是一个动态数组类。相较于静态数组,std::vector 能够根据需求自动扩展或缩小,非常适合在算法竞赛中使用。在蓝桥杯比赛中,std::vector 常用于存储动态数据、处理数组扩展问题,甚至可以代替二维数组以简化代码。

1. std::vector 的基础概念

std::vector 是一种动态数组容器,可以根据需要动态调整大小。其底层实现是连续的内存块,能够支持随机访问(即通过索引访问元素)。与普通数组相比,它不仅支持增删操作,还能自动扩展容量,从而更灵活。

std::vector 的内部机制std::vector 的动态扩展机制基于 容量(capacity) 的概念。vector 会在内部维护一个预分配的内存块以存储元素。当容量不足时,vector 会自动扩展为原来的 1.5 倍或 2 倍,从而减少频繁分配内存的开销。

2. 创建 std::vector

在创建 std::vector 时,可以通过不同的方式初始化它:

3. 动态扩展和容量管理

3.1 动态扩展

当使用 push_back() 向 vector 中添加元素时,如果容量不够,vector 会自动分配更多的内存,重新拷贝现有元素,从而扩展容量。

std::vector<int> vec;
for (int i = 0; i < 10; i++) {
    vec.push_back(i);
    std::cout << "Size: " << vec.size() << ", Capacity: " << vec.capacity() << std::endl;
}

3.2 手动管理容量

如果预先知道 vector 大小,可以使用 reserve() 函数来分配内存,从而避免多次扩展的性能开销:

std::vector<int> vec;
vec.reserve(10); // 预分配容量为10
for (int i = 0; i < 10; i++) {
    vec.push_back(i);
}

4. 常用操作和方法

4.1添加和删除元素

  • push_back(): 在末尾添加元素
  • pop_back(): 删除末尾元素
  • insert(): 在指定位置插入元素
  • erase(): 删除指定位置的元素
  • clear(): 清空所有元素
std::vector<int> vec = {1, 2, 3, 4, 5};
vec.push_back(6); // {1, 2, 3, 4, 5, 6}
vec.pop_back();   // {1, 2, 3, 4, 5}
vec.insert(vec.begin() + 2, 10); // {1, 2, 10, 3, 4, 5}
vec.erase(vec.begin() + 2); // {1, 2, 3, 4, 5}
vec.clear(); // 清空所有元素,size 为 0

4.2 访问元素

  • 随机访问:可以使用索引访问 vector 中的元素。
  • 边界检查:使用 at() 方法可以提供越界检查,防止非法访问。
std::vector<int> vec = {1, 2, 3, 4, 5};
std::cout << vec[0] << std::endl;   // 输出: 1
std::cout << vec.at(1) << std::endl; // 输出: 2,带边界检查

4.3 迭代器遍历

可以使用迭代器来遍历 vector。使用 begin() 和 end() 可以获取 vector 的首尾位置。

std::vector<int> vec = {1, 2, 3, 4, 5};
for (auto it = vec.begin(); it != vec.end(); ++it) {
    std::cout << *it << " ";
}
std::cout << std::endl;

5. std::vector 在竞赛中的应用场景

5.1 动态数据存储

在算法竞赛中,我们常常需要存储未知数量的数据。例如,读取输入数据时,std::vector 可以轻松地进行动态扩展:

int n;
std::cin >> n;
std::vector<int> data;

for (int i = 0; i < n; i++) {
    int x;
    std::cin >> x;
    data.push_back(x);
}

// 输出所有数据
for (int x : data) {
    std::cout << x << " ";
}

5.2 模拟栈结构

std::vector 提供的 push_back() 和 pop_back() 操作,与栈的数据结构操作类似,因此可以用 vector 模拟栈来解决括号匹配等问题。

std::string s = "((()))";
std::vector<char> stack;

for (char c : s) {
    if (c == '(') {
        stack.push_back(c);
    } else if (!stack.empty() && stack.back() == '(') {
        stack.pop_back();
    }
}

if (stack.empty()) {
    std::cout << "匹配成功!" << std::endl;
} else {
    std::cout << "匹配失败!" << std::endl;
}

5.3 模拟二维数组

在图的算法中,可以用 std::vector<std::vector> 来表示邻接矩阵。以下是一个示例:

int n = 5; // 顶点个数
std::vector<std::vector<int>> graph(n, std::vector<int>(n, 0));

// 添加边
graph[0][1] = 1;
graph[1][2] = 1;
graph[2][3] = 1;
graph[3][4] = 1;

// 输出邻接矩阵
for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
        std::cout << graph[i][j] << " ";
    }
    std::cout << std::endl;
}

6.注意事项

  • 性能优化:频繁的动态扩展可能会导致性能下降。可以在已知大小的情况下提前 reserve() 容量。
  • 边界检查:at() 提供了安全访问,但如果对性能要求高,可以直接使用 [] 操作符。
  • 二维 vector:在图的算法中,尽量选择合适的数据结构以提高代码效率。

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

相关文章

  • 给ActiveX签名的实现方法详解

    给ActiveX签名的实现方法详解

    本篇文章是对给ActiveX签名的实现方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 一张图总结C++中关于指针的那些事

    一张图总结C++中关于指针的那些事

    今天小编就为大家分享一篇关于一图总结C++中关于指针的那些事,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • C语言中操作字符串的函数详解

    C语言中操作字符串的函数详解

    这篇文章主要为大家详细介绍了C语言中操作字符串的函数,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • QT使用QFile进行文件操作

    QT使用QFile进行文件操作

    本文主要介绍了QT使用QFile进行文件操作,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • C++如何通过ostringstream实现任意类型转string

    C++如何通过ostringstream实现任意类型转string

    再使用整型转string的时候感觉有点棘手,因为itoa不是标准C里面的,而且即便是有itoa,其他类型转string不是很方便。后来去网上找了一下,发现有一个好方法
    2013-09-09
  • C++中set的用法学习

    C++中set的用法学习

    Set是C++ STL(标准模板库)的一个容器类,它用于存储不同的值,并且可以按照特定顺序进行访问和操作。本文就来通过一些示例和大家简单讲讲set的用法吧
    2023-05-05
  • C语言开发实现井字棋及电脑落子优化示例详解

    C语言开发实现井字棋及电脑落子优化示例详解

    以前上课经常和同桌玩起井字棋,那么我们就当我们回忆童年,现在也用C语言来实现井字棋,本次代码相对于初阶的井字棋,在电脑下棋代码部分做了优化,使得电脑更加具有威胁
    2021-11-11
  • C语言 用while循环求和的平均值操作

    C语言 用while循环求和的平均值操作

    这篇文章主要介绍了C语言 用while循环求和的平均值操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • C++ Boost TypeTraits库使用详解

    C++ Boost TypeTraits库使用详解

    Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称
    2022-11-11
  • c++ 判断奇数偶数实例介绍

    c++ 判断奇数偶数实例介绍

    下面通过判断一个数是偶数还是奇数来展示交互递归的应用,并且此题突出了递归跳跃的信任的重要性,需要的朋友可以参考下
    2012-11-11

最新评论