【问题标题】:How to iterate on a subset of an STL Map in C++ [closed]如何在 C++ 中迭代 STL 映射的子集 [关闭]
【发布时间】:2016-08-06 10:12:21
【问题描述】:

我不明白如何仅在 Stl 地图的一部分上进行迭代,而不是像在标准遍历中那样从头到尾进行迭代。这是我的代码:

    auto end = temp_map.rbegin() + THRESHOLD_NUM;

    for (auto rit = temp_map.rbegin(); rit != end; ++rit)
    {
        int s = rit->second;

        for (int k = 0; k < MAX_ROWS; k++)
        {
            array_dist_it[k] = abs(input[k] - input_matrix[k][s]);
        }

        float av_real = mean(MAX_ROWS, array_dist_it);

        float score_real = score_func(av_real);

        rank_function(score_real, s);
    }
}

我认为问题与 for 循环的语法有关,尤其是与迭代器有关。该错误与无效的运算符有关。

【问题讨论】:

  • 这不是一个众包调试平台。你有没有经历过这些可能性? 认为哪里不对?您尝试过什么来修复它?您认为还有哪些其他方法可能有效?你试过那些吗?您研究过哪些研究材料,为什么您认为其中推荐的方法不适合您的情况? Stack Overflow 不是 thought 的替代品;至少,这该死的不应该。
  • "有什么问题"怎么了?
  • 对不起,如果我解释得不好,显然我已经尝试了所有想到的可能性,错误当然与迭代器有关。我不是来为自己辩解的,而是想和你一起寻求解决方案。显然,在询问之前我已经搜索了其他可能性。我不完全明白你的意思。如果对你来说我的问题是微不足道的,那就是另一点。
  • 除非您提供确切的错误消息或证明问题的输出,否则我们无法看到这“显然不起作用”。

标签: c++ loops dictionary stl iterator


【解决方案1】:

std::map 有一个BidirectionalIterator。它支持递增和递减,但不支持加减。如果你需要推进和迭代N次,那么你可以使用std::next。使用它而不是

auto end = temp_map.rbegin() + THRESHOLD_NUM;

你会的

auto end = std::next(temp_map.rbegin(), THRESHOLD_NUM);

【讨论】:

  • 点击你自己的链接:std::advancevoid返回类型。此外,tsk tsk 回答题外话问题(尽管这个问题可能会被 MCVE 接受(如果微不足道的话))。
  • @LightnessRacesinOrbit 我使用了错误的函数,我更正了使用std::next 的答案。至于其余部分,很明显auto end = temp_map.rbegin() + THRESHOLD_NUM; 是一个错误。
  • 它有多明显是无关紧要的。我们正在尝试在这里构建高质量的问答,而不是在猜测 OP 甚至没有写出错误消息的离题问题中出现的代码中的明显缺陷时采取 FGITW 的策略。这个问题根本无法搜索,因此它在 Stack Overflow 上不算“有用”……因此,不应该通过猜测来鼓励它。 / 感谢您修复您提出的解决方案。
猜你喜欢
  • 2011-05-29
  • 2011-04-02
  • 1970-01-01
  • 1970-01-01
  • 2011-05-11
  • 2013-11-26
  • 2013-01-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多