【问题标题】:C++: Find minimum in array only among elements with specified indicesC ++:仅在具有指定索引的元素中查找数组中的最小值
【发布时间】:2018-04-04 04:59:39
【问题描述】:

我找不到以下问题的解决方案:

我试图在 C++ 数组中找到最小值,但不查看内部的所有元素,只查看具有指定索引的元素。 例如,如果给定一个索引 k 和一个数组 int* mylist = int[n],那么我只想在元素的“子列表”中查找 mylist 中的最小元素,例如各个元素的索引 i 满足 i%n = k。 在 Python 中,这可以通过以下方式轻松解决

min([mylist[i]  for i in range(n) if i%n==k]),

但是 afaik,C++ 中没有等价物。此外,据我所知,lambda 函数并不能解决问题。

知道如何有效地做到这一点吗?任何建议将不胜感激!

【问题讨论】:

  • C++ 中没有等价物。我不同意那个..有 lambda 以及有 stl 来找到 min
  • 到目前为止,我无法弄清楚在这种情况下如何使用 lambda,但我希望我不必为此使用循环,我只是不知道如何
  • std::vector::iterator result = std::min_element(std::begin(v), std::end(v),[] (int val) { return val %n = k;); val%n = k (你可以把你的表达方式
  • std::begin(v), std::end(v) ,你可以在开始和结束时修复索引
  • boost range 可能包含您需要的内容。但是,我会选择循环。它只有几行代码,可能是最有效的方式(这是 c++ 而不是 python!)

标签: python c++ arrays lambda minimum


【解决方案1】:

这是为什么标准算法使用迭代器而不是直接使用容器/集合的一个示例。它允许您编写一个包含您关心的索引的迭代器。

问题是编写迭代器比大多数人想要的要多,或者认为对于这个简单的任务是合理的。 Boost 有一些实用程序可以更轻松地实现迭代器,例如 filter iterator,但据我所知,这些仅基于集合的 content 应用,而不是索引。

创建index_filter 所涉及的代码相当简单(例如,应该很容易从上面链接的filter_iterator 的代码中推断出来),但是那里的样板代码比大多数人想要的要多。除非你经常做这样的事情,否则可能很难证明这一点。

【讨论】:

    【解决方案2】:

    i % n = k 将是一个:

    1. k 如果k < n
    2. [] 为空,如果 k > n

    这是因为 i 不同于 0 to n

    因此只有一个或没有元素。

    为清楚起见:n = 50; print([i%n for i in range(n)]),给出:

    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49]
    

    0 to n-1之间的唯一值

    【讨论】:

    • 我认为您对示例代码的理解超出了预期。我假设i%n 真的是i%m。更一般地说,它根本不一定与余数有关——只是一个选择索引子集的函数。
    • 是的,我明白,这个问题很难像 python 的情况一样作为单行来实现。但这只是为了回答 OP 的问题,如果真的是这样的话。
    • 没错,我不是说字面意义上的例子,实际上是n*n是数组的长度,而不是n。这就是为什么可能存在不止一个元素的原因,但无论如何感谢您澄清这一点。
    【解决方案3】:

    使用range-v3,您可以执行类似的操作:

    for (auto e : v | ranges::view::drop(3) | ranges::view::stride(5)) {
        std::cout << e << std::endl;   
    }
    

    所以你遍历索引5 * k + 3

    您可以在结果视图上调用ranges::min_element

    auto view = v | ranges::view::drop(3) | ranges::view::stride(5);
    auto it = ranges::min_element(view);
    std::cout << *it << std::endl;
    

    Demo

    【讨论】:

      猜你喜欢
      • 2019-01-12
      • 2021-06-20
      • 2017-01-17
      • 2018-10-17
      • 1970-01-01
      • 1970-01-01
      • 2011-11-27
      • 2011-02-22
      • 1970-01-01
      相关资源
      最近更新 更多