итерация по нескольким диапазонам одного массива - PullRequest
1 голос
/ 07 марта 2020

У меня есть массив, содержащий элементы, и массив, содержащий диапазоны,

struct range
{
    uint32_t head;
    uint32_t tail;
};

head и tail - это начальный и конечный индексы, каждый head выровнен на 64 байта.

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

Как я могу перебирать элементы, ограниченные диапазоном без двойного для l oop, например,

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

, просто используя single для l oop?

1 Ответ

4 голосов
/ 07 марта 2020

Я имею в виду, я бы предложил двойное for l oop решение для этого, но верный пример:

#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;
    }
  }
}

Я не предлагаю это. Решение, которое вы нашли в ответе, более читабельно.

...