PAT 1048 水题 注意c++的foreach

博客探讨了在C++中使用foreach迭代器时遇到的问题,特别是当尝试修改容器元素时。文章指出,使用auto指针遍历容器会创建元素副本,导致无法直接更新原始容器。建议使用auto&指针以引用元素并正确修改容器。代码示例展示了如何避免这个问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PAT 1048 水题 注意c++的foreach

水题。注意c++的foreach在auto指针下遍历时,每次取出容器中的一个元素加入当前副本中,因此不能直接用当前元素进行更新,如果用auto& 指针则可以修改容器中的元素。

代码

#include <iostream>
#include <map>
using namespace std;
int N, M;
map<int, int> m;
int main()
{
    cin >> N >> M;
    for (int i = 0; i < N; i++) {
        int tmp;
        cin >> tmp;
        m[tmp]++;
    }
    bool flg = true;
//     for (auto i : m) {
//         if (i.first > M - i.first) {
//             break;
//         }
//         m[i.first]--;// 不要写成i.second--,这个是一个容器副本,无法修改
//         //cout<<m[7]<<endl;
//         if (m[M - i.first]) {
//             cout << i.first << " " << M - i.first << endl;
//             flg = false;
//             break;
//         }
//     }
        for (auto& i : m) {
        if (i.first > M - i.first) {
            break;
        }
        i.second--;
        if (m[M - i.first]) {
            cout << i.first << " " << M - i.first << endl;
            flg = false;
            break;
        }
    }
    if (flg) {
        cout << "No Solution" << endl;
    }
}

46ms

### C++ 中 `foreach` 的用法及其替代方案 在 C++ 标准库中并没有直接提供名为 `foreach` 的关键字或函数。然而,可以通过多种方法实现遍历容器的功能。 #### 使用范围for循环 自 C++11 起引入了基于范围的 for 循环(range-based for loop),这提供了类似于其他编程语言中的 foreach 功能。语法如下: ```cpp #include <vector> #include <iostream> int main() { std::vector<int> numbers = {1, 2, 3, 4, 5}; // 遍历并打印向量中的每一个整数 for (const auto& num : numbers) { std::cout << num << " "; } } ``` 此代码片段展示了如何利用基于范围的 for 循环轻松迭代整个集合的内容[^1]。 #### STL算法配合lambda表达式 标准模板库(STL) 提供了一系列强大的泛型算法用于操作序列化数据结构。结合 lambda 表达式的使用可以让程序更加简洁明了: ```cpp #include <algorithm> #include <vector> #include <iostream> int main(){ std::vector<int> nums={10,20,30}; // 使用std::for_each 和 Lambda 函数来模拟 foreach行为 std::for_each(nums.begin(),nums.end(), [](int n){std::cout<<n<<" ";}); } ``` 这段例子说明了通过调用 `std::for_each()` 来执行相同的操作——即对给定区间内的每个元素应用指定的动作。 关于处理可能存在的 `NULL` 或者空字符串的情况,在上述两种情况下都不需要特别考虑这些特殊情况;因为无论是 range-for 还是 stl-algorithm 方案都是针对有效对象进行操作。对于那些可能存在未初始化状态的数据成员,则应该遵循建议查询方式:对于 `NULL` 值应采用 `is null / is not null` 查询条件,而对于空串则可以直接比较是否等于空字符(`''`)即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值