【问题标题】:what is the use of == a.end() in find() c++ stl in if conditional?如果有条件,在 find() c++ stl 中 == a.end() 有什么用?
【发布时间】:2020-05-13 00:35:49
【问题描述】:

我刚刚解决了一个 codeforces 问题,我在作者的教程解决方案中发现了一些关于 find() c++ stl 的新内容……但我无法理解。在这里,find(a.begin(), a.end(), s-i) == a.end() 中的==a.end() 是做什么的?

(问题链接:http://codeforces.com/contest/1293/problem/A

//Author's tutorial solution
#pragma GCC optimize("Ofast")

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

#define endl '\n'

int n, s, k;
vector<int> a;

void Input() {
    cin >> n >> s >> k; a.clear(); a.resize(k);
    for (auto &z: a) cin >> z;
}

void Solve() {
    for (int i=0; i<=k; i++) {
        if (s-i >= 1 && find(a.begin(), a.end(), s-i) == a.end()) {cout << i << endl; return;} //SEE HERE
        if (s+i <= n && find(a.begin(), a.end(), s+i) == a.end()) {cout << i << endl; return;} //SEE HERE
    }
    assert(false); 

int main(int argc, char* argv[]) {
    ios_base::sync_with_stdio(0); cin.tie(NULL);
    int T; cin >> T; while (T--) {Input(); Solve();} return 0;
}

【问题讨论】:

  • 你知道find返回什么吗?
  • 这是一个常规比较。也许您将其误认为是对find 的调用的一部分?
  • a 是向量类型。如果您查看referencefind 可以使用两个迭代器作为一个范围来在该范围内查找指定值。在这种情况下,std::vector::end() 返回向量 a 中的最终迭代器。您可以查看end() here 的文档。
  • 请通过good book 学习 C++,而不是通过查看随机代码,尤其是来自竞争性编程网站的随机代码。你不会正确地学习语言。
  • 互联网 90% 都是垃圾,通常很难从垃圾中挑选出值得学习的东西。您正在查看的内容是好东西的一个迹象是它使用了描述性标识符。使用的名称描述了所命名的内容或代表的内容。这使代码更易于阅读,并具有额外的好处,即更难意外地将b 交换为d,并且如果发生这种情况更容易被发现。

标签: c++ stl find


【解决方案1】:

std::find 和其他类似函数将迭代器返回到找到的元素。如果在容器中找不到元素,则返回的 Iterator 指向指定范围的末尾(在您的情况下为 std::end)。所以,find(a.begin(), a.end(), s-i) == a.end() 表示元素s-i 不在容器a 中。

cpp reference

【讨论】:

  • 编码器写find(a.begin(), a.end(), s-i) == a.end() 以便打印i iff s-i 存在于矢量a 中。假设find() 返回了一个迭代器而不是a.end()(即如果s-ia 中找到),在这种情况下find(a.begin(), a.end(), s-i) ==``` a.end()``` 必须是@987654337 @,因为重新调整的迭代器不是 == a.end()....& 因此在这种情况下,if 语句代表 falsei 不得打印,这与使用有条件的。 i 必须打印以防找到```s-i````。
  • 对不起,如果这是一个愚蠢的疑问......但我仍然找不到 find(a.begin(), a.end(), s-i) == a.end() 不是 find(a.begin(), a.end(), s-i) != a.end() 我认为这是合适的逻辑
  • 如果在向量中找到s-ifind(a.begin(), a.end(), s-i) != a.end 将始终为true我的想法find(a.begin(), a.end(), s-i) 如果找到s-i,则返回一个迭代器到s-i。在这种情况下,cleary find 没有返回a.endl()。所以find(a.begin(), a.end(), s-i) != a.end 代表true,因此允许ifconditional 打印i
  • 先生/女士请帮我解决我的疑问
  • @noobCoder003 我认为你误读了一些东西。 The actual editorial text 声明“确定 s−x 或 s+x 是否是...不是 [in] 封闭列表”,因此检查 == end()
【解决方案2】:

根据文档 (http://www.cplusplus.com/reference/algorithm/find/):

返回:指向要比较的范围内第一个元素的迭代器 等于 val。如果没有元素匹配,则函数返回最后一个。

find(a.begin(), a.end(), s-i) 尝试在a 中查找s-i,并在失败时返回a.end()

find(a.begin(), a.end(), s-i) == a.end() 是一个布尔表达式,当s-ia 中没有找到时,其计算结果为true,否则为false

【讨论】:

    猜你喜欢
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-06
    • 2021-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多