Везде, где я читал, вы должны использовать алгоритмы 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 легче понять, чем накопить , Я что-то пропустил? Есть ли лучший способ разделить большой буфер на порции?