【问题标题】:What does for(auto &it: a) mean? [duplicate]for(auto &it: a) 是什么意思? [复制]
【发布时间】:2020-08-06 07:47:19
【问题描述】:

我是新手,正在学习如何以更灵活的方式使用 c++ 语言。

在一个竞赛题中,我看到有人这样写代码:

#include <bits/stdc++.h>
using namespace std;

int main() {
#ifdef _DEBUG
    freopen("input.txt", "r", stdin);
//  freopen("output.txt", "w", stdout);
#endif
    
    int t;
    cin >> t;
    while (t--) {
        int n;
        cin >> n;
        vector<int> a(n);
        for (auto &it : a) cin >> it;
        sort(a.begin(), a.end());
        bool ok = true;
        for (int i = 1; i < n; ++i) {
            ok &= (a[i] - a[i - 1] <= 1);
        }
        if (ok) cout << "YES" << endl;
        else cout << "NO" << endl;
    }
    return 0;
}

我假设vector&lt;int&gt; a(n);这一行声明了一个向量并分配了空间。

我的疑问是:

  1. 我对 (auto &amp;it : a) cin &gt;&gt; it; 的这个工作原理感到困惑。

  2. ok &amp;= (a[i] - a[i - 1] &lt;= 1);这个表达我也看不懂。

【问题讨论】:

标签: c++ for-loop vector operators


【解决方案1】:

1.

(auto &it : a) cin >> it 

表示你接受向量a的输入。

类似于:

for(int i = 0 ; i < n; i++){
    cin>>a[i]; 
}

auto 关键字指定正在声明的变量的类型将自动从其初始化程序中扣除。所以这里it 使用a[i] 的引用,而不是a[i] 作为it

2.

(a[i] - a[i - 1] <= 1)

结果布尔值 1(如果条件为真)或 0(如果条件为假)。

ok &= (a[i] - a[i - 1] <= 1) 

表示ok = ok &amp; 1ok = ok &amp; 0,取决于条件真假。

【讨论】:

  • 明白了! & 符号让我很困惑,否则我想我明白了
  • & 是按位逻辑和类似 12 & 5 的操作。 12->1100 和 5=>0101 所以 a&b = 0100 即 4
  • aaand 你能告诉我为什么当我使用不同的方法找到最小元素时我得到不同的结果吗? pastebin.com/DBd594vb
  • 这两种方法都可以正确找到最小元素。你能告诉我结果不同的情况吗
【解决方案2】:

你有一个vector&lt;T&gt; x 然后你想遍历每个元素

你可以用旧的“c”风格做这样的事情:

for (int i=0; i<x.size(); ++i)

但您也可以使用基于范围的循环:

for (T i:x)

因此i 是从向量中的元素获取的副本 所以如果你需要你做的参考:

for (T& i:x)

这里是你代码的答案,因为 c++11 你可以推断 i auto 的类型 -matically 因此语法

for (auto& i : x)

【讨论】:

  • auto 不用提 C++11,基于范围的循环在 C++11 之前也没有。
  • @mch 我提到了 auto 因为它只能在 c++11 之后工作,但是谢谢:)!
【解决方案3】:

语法:

for (auto& it : a)

称为基于范围的循环。

它用于操作a数组或向量中给定的每个元素,元素的类型将等同于a的类型。

OTOH,&amp; 声明对 a 中任何元素 it 的任何修改都将被替换,并且不会制作副本以供临时使用(即通过引用)。

简而言之,如果一个元素的值是3,如果你把它改成5,那么原来的数组或者向量就会受到影响。


ok &= (a[i] - a[i - 1] <= 1);

等同于 is 不是对运算符的引用,在这种情况下它是按位的:

ok = ok & (a[i] - a[i - 1] <= 1);

由于ok 的类型是bool,因此只能保留true (1)false (0)

【讨论】:

  • 我现在得到了那个部分,但是 ok& 呢?
  • @Maisha ok ?= (exp) 等价于按位计算ok ? (exp)
猜你喜欢
  • 2021-09-18
  • 2011-04-16
  • 2013-09-26
  • 1970-01-01
  • 2020-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多