我读到的每个地方都必须在所有可能的地方使用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循环比累加的循环容易理解。我想念什么吗?有没有更好的方法将大缓冲区分成块?