折叠,堆积,循环

时间:2020-02-14 19:32:17

标签: c++ algorithm functional-programming fold c++20

我读到的每个地方都必须在所有可能的地方使用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;
};

一旦我们在这里,就会更容易。 我们必须使用以下lambda进行左折(std会累积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);

lambda有点复杂... for range循环可以做得更好:

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

在这种情况下,似乎for循环比累加的循环容易理解。我想念什么吗?有没有更好的方法将大缓冲区分成块?

0 个答案:

没有答案