2

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

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

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

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

_currentItem == _endItem

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

_currentItem++

在 processDescription() 结束时,但我不明白如何为此目的在 _description 属性的 init 处填充范围迭代器数组,以及如何获取要在 processDescription() 中处理的字符串。

感谢您对此有所了解。

4

1 回答 1

2

给定两个要从中创建范围的迭代器,您只需构造 aboost::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;
于 2012-06-27T16:42:42.320 回答