C++ 连续数值转区间计算
代码class UnicodeRange { public: uint32_t start 0; uint32_t end 0; }; using UnicodeRanges std::vectorUnicodeRange; UnicodeRanges getRanges(const std::setuint32_t unicodes) { if (unicodes.empty()) return {}; UnicodeRanges ranges; if (*unicodes.begin() unicodes.size() *unicodes.rbegin()) { // 全部连续 ranges.emplace_back( UnicodeRange { *unicodes.begin(), (uint32_t)(*unicodes.begin() unicodes.size()) }); return ranges; } UnicodeRange curRange; curRange.start *unicodes.begin(); curRange.end *unicodes.begin(); for (const auto code : unicodes) { if (code curRange.end) { curRange.end code 1; } else { ranges.emplace_back(curRange); curRange.start code; curRange.end code 1; } } if (ranges.empty() || ranges.back().start ! curRange.start) ranges.emplace_back(curRange); // 尾部连续 return ranges; }测试std::setuint32_t ranges { 1, 2, 3, 4, 9, 22, 23, 24, 90, 91, 100 }; auto blockRanges getRanges(ranges); for (const auto block : blockRanges) { LOG_INFO_STREAM block: block.start - block.end std::endl; }输出block: 1 - 5 block: 9 - 10 block: 22 - 25 block: 90 - 92 block: 100 - 101创作不易小小的支持一下吧