Складывание, накопление, для петли - PullRequest
0 голосов
/ 14 февраля 2020

Везде, где я читал, вы должны использовать алгоритмы std везде, где сможете.

Вот проблема, которую я хотел решить. У меня есть большой вектор байтов, который я хочу разделить на куски.

Итак, я начал что-то без алгоритмов, и это было немного сложно, поэтому я попытался разложить вещи.

Здесь это «менеджер чанков»

struct ChunkManager {
public:
    void push_byte(std::byte byte) noexcept {m_bytes[index++] = byte;}
    bool isComplete() const noexcept {return m_index == 256;}
    auto getChunk() const noexcept {return m_bytes;}
private:
    std::size_t index{0};
    std::array<std::byte, 256> m_bytes;
};

Когда мы здесь, это проще. Мы должны выполнить левый сгиб (стандартное накопление с улучшениями C ++ 20 (семантика перемещения)) со следующей лямбдой.

auto gatherChunks = [](auto chunks, auto byte) {
    if(chunks.back().isComplete()) {
        chunks.emplace_back(ChunkManager{});
    }
    chunks.back().push_byte(byte);
    return chunks;
};

Мы выполняем накопление:

auto bytes = std::vector<std::byte>{...};
auto chunks = std::accumulate(begin(bytes), end(bytes),
              std::vector{ChunkManager{}}, 
              gatherChunks);

Лямбда немного усложняет ... А для диапазона l oop может лучше выполнять работу:

auto bytes = std::vector<std::byte>{...};
auto chunks = std::vector{ChunkManager{}};
for(auto byte: bytes) {
    if(chunks.back().isComplete()) {
        chunks.emplace_back(ChunkManager{});
    }
    chunks.back().push_byte(byte);
}

В этом случае, кажется, что для l oop легче понять, чем накопить , Я что-то пропустил? Есть ли лучший способ разделить большой буфер на порции?

...