《C++算法竞赛攻略:从入门到降维打击》——第2章

第2章:算法竞赛的C++“瑞士军刀”

欢迎来到你的“武器库”。如果说算法思想是内功心法,那么C++的STL(Standard Template Library,标准模板库)就是我们手中的神兵利器。在机试中,我们追求的不是从零手写数据结构(除非题目明确要求),而是在最短的时间内,用最稳定、最高效的工具解决问题。本章介绍的STL容器和算法,就是为了这个目标而存在的“瑞士军刀”,它们功能强大、身经百战,能帮你轻松应对各种场景。

在学习本章时,不必强求一次性记住所有细节。你可以先快速浏览,对每个工具的功能有个大概印象。在后续学习算法章节时,可以随时回到本章,像查阅字典一样复习和巩固这些“武器”的用法。

核心提示: 在机试中,为了方便,我们通常在代码开头写上 #include <bits/stdc++.h>using namespace std;。前者包含了所有标准库头文件,后者省去了繁琐的 std:: 前缀。虽然这不是规范的工程做法,但在分秒必争的赛场上,这是效率的体现。


2.1 动态数组 vector:最灵活的数组容器

在C++中,普通数组 int a[100]; 的大小在编译时就固定了,无法在程序运行时改变,这在处理不确定数量的数据时非常不便。vector 作为“动态数组”,完美地解决了这个问题。

  • 它是什么? vector 是一个可以根据需要自动增长和缩小的数组。
  • 为什么用? 它是普通数组的完美替代品,提供了更安全、更灵活的数组操作。
  • 怎么用?
    • 引入头文件: #include <vector>
    • 声明:
      vector<int> v; // 声明一个存放 int 的空 vector
      vector<double> v2(10); // 声明一个包含10个元素的 vector,默认值为0.0
      vector<int> v3(10, 6); // 声明一个包含10个元素的 vector,所有元素初始化为6
      
    • 核心操作:
      • v.push_back(x): 在 vector 的末尾添加元素 x。这是最常用的操作。时间复杂度为均摊 O(1)O(1)O(1)
      • v.size(): 返回 vector 中元素的个数。时间复杂度为 O(1)O(1)O(1)
      • v[i]: 像普通数组一样访问下标为 i 的元素。时间复杂度为 O(1)O(1)O(1)
      • v.pop_back(): 删除 vector 的最后一个元素。
      • v.clear(): 清空 vector 中的所有元素。
      • v.begin() / v.end(): 返回指向开头和结尾(的下一个位置)的迭代器,常用于配合 <algorithm> 头文件中的函数(如sort)。

实战代码示例:

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
   
   
    using namespace std;
    // 声明一个空的 vector 用于存放整数
    vector<int> nums;
    cout << "请输入若干整数(输入非数字结束):" << endl;
    int x;
    // 循环读入,直到输入无效
    while (cin >> x) {
   
   
        nums.push_back(x);
    }
    
    cout << "你输入的元素个数是: " << nums.size() << endl;
    
    // 使用 for-each 循环遍历并打印
    cout << "元素为: ";
    for (int num : nums) {
   
   
        cout << num << " ";
    }
    cout << endl;
    
    // 对 vector 进行排序
    sort(nums.begin(), nums.end());
    
    cout << "排序后的元素为: ";
    for (int num : nums) {
   
   
        cout << num << " ";
    }
    cout << endl;

    return 0;
}

2.2 字符串 string:操作与技巧

C++的 string 类型远比C语言的字符数组 char[] 强大和易用。它封装了所有常见的字符串操作。

  • 它是什么? 一个专门用于处理文本数据的动态字符数组。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱看烟花的码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值