Розгляньмо ситуація: у вас є буфер із якимись мережевими пакетами і їхні розміри: void Packetize(std::vector<uint8_t> &buffer, std::vector<uint16_t> &sizes). Тепер щоб надіслати ці пакети, вам потрібно обрахувати зміщення. Що може бути простіше із STL:

std::vector<uint32_t> offsets(sizes.size() + 1);
offsets[0] = 0;
std::partial_sum(sizes.begin(), sizes.end(), offsets.begin() + 1);

Код простий, елегантний, збирається і працює добре поки ваш буфер менший 64 Kб. Але потім ви виявите, що для більших буферів зміщення пакетів не зростають монотонно. Так, функція partial_sum накопичує у змінну, яка має тип значення вхідного ітератора!

Тож або ви маєте переконатися, що sizes збережено у достатньо широкому типі (наприклад, uint32_t), або використати transform_iterator з Boost:

std::vector<uint32_t> offsets(sizes.size() + 1);
offsets[0] = 0;

struct Cast
{
    uint32_t ToUint32(uint16_t v) { return v; }
};

std::partial_sum(boost::make_transform_iterator(sizes.begin(), Cast::ToUint32),
                 boost::make_transform_iterator(sizes.end(), Cast::ToUint32),
                 offsets.begin() + 1);