【问题标题】:iterate over multiple ranges of same array遍历同一数组的多个范围
【发布时间】:2020-03-07 20:16:39
【问题描述】:

我有一个包含项目的数组和一个包含范围的数组,

struct range
{
    uint32_t head;
    uint32_t tail;
};

headtail 是开始和结束索引,每个 head 都是 64 字节对齐的。

         0     64    128   192   256   320   384   448   512 ...
  items: |--------|  |----------------|      |---------|     ...
 ranges: head  tail  head          tail      head   tail     ...

如何在没有双重 for 循环的范围内迭代项目,

for (uint32_t i = 0; i < range_count; i++)
{
    for(uint32_t j = ranges[i].head; j < ranges[i].tail; j++)
    {
        ... items[j];
        ...
    }
}

只使用单个 for 循环?

【问题讨论】:

  • 使用双 for 循环有什么问题?它的优点是易于理解。
  • 内循环的条件应该是“j &lt; ranges[i].tail”吗?如图所示,没有多大意义。
  • 目前的解决方案有什么不好?
  • 您可以编写一个自定义迭代器类来执行此操作,但循环要简单得多
  • 请决定您要使用C++还是C代码并删除其他标签

标签: c++ c for-loop iteration


【解决方案1】:

我的意思是,我建议使用双 for 循环解决方案,但可以肯定的是,例如:

#include <cstdint>
#include <iostream>
#include <iterator>

struct range
{
  std::uint32_t head;
  std::uint32_t tail;
};

int
main()
{
  range r[5]{ { 1, 4 }, { 5, 7 }, { 2, 5 }, { 8, 9 }, { 4, 7 } };

  for (std::size_t i = 0, j = 0, ranges = std::size(r); i < ranges;) {
    auto const index = r[i].head + j;
    std::cout << index << ' ';

    if (index == r[i].tail) {
      j = 0;
      ++i;
      std::cout << '\n';
    } else {
      ++j;
    }
  }
}

我不建议这样做。您在答案中的解决方案更具可读性。

【讨论】:

    猜你喜欢
    • 2018-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多