代码
class UnicodeRange {
public:
uint32_t start = 0;
uint32_t end = 0;
};
using UnicodeRanges = std::vector<UnicodeRange>;
UnicodeRanges getRanges(const std::set<uint32_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::set<uint32_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
创作不易,小小的支持一下吧!