使用boost range_iterator数组来分割字符串

时间:2012-06-27 15:30:16

标签: c++ boost range

我想用给定固定长度的块(例如15个字符)在C ++中处理一个无限长的字符串。

字符串是负责处理它的类的属性(让我们调用类“Person”和属性“_description”),外部代码必须调用一个方法来顺序处理每个块,例如人:: processDescription()。另一种方法允许查看是否还有一个块要处理,例如人:: isThereMoreDescriptionToBeProcessed()。

为了避免处理索引和可能的副作用(+ 1 / -1,init ..的错误),有人建议我存储一系列range_iterators(boost)并迭代它们进行处理,但我不知道我不知道range_iterator概念和Boost文档在这里没有太多帮助。

我想我会存储2个项目(例如_currentItem和_endItem)作为Person的属性并执行类似

的检查
_currentItem == _endItem

在isThereMoreDescriptionToBeProcessed()中,我想我会做类似的事情

_currentItem++

在processDescription()的末尾,但我无法理解为什么我可以在_description属性的init处填充范围迭代器数组以实现此目的,如何在processDescription()中获取要处理的字符串

感谢你为此投了一些灯。

1 个答案:

答案 0 :(得分:1)

给定两个想要创建范围的迭代器,您只需构造一个boost::iterator_range并将两个迭代器作为构造函数参数传递。

以下代码将str拆分为三个字符段,并将每个段推送到ranges

std::vector<boost::iterator_range<std::string::iterator>> ranges;
std::string str = "abcdefghijk";

auto it = str.begin();
auto lastIt = it;
while (it != str.end())
{
    lastIt = it;
    if (std::distance(it, str.end()) < 3)
        it = str.end();
    else
        std::advance(it, 3);

    ranges.push_back(
        boost::iterator_range<std::string::iterator>(lastIt, it)
    );
}

for (auto segment = ranges.begin(); segment != ranges.end(); ++segment)
    std::cout << std::string(segment->begin(), segment->end()) << std::endl;