2

C ++で、指定された固定長(15文字など)のチャンクで無限に長い文字列を処理したいと思います。

文字列は処理を担当するクラスの属性であり(クラス「Person」と属性「_description」を呼び出します)、外部コードは各チャンクを順番に処理するメソッド(Person :: processDescription()など)を呼び出す必要があります。別のメソッドでは、処理するチャンクがもう1つあるかどうかを確認できます(例:Person :: isThereMoreDescriptionToBeProcessed())。

インデックスと起こりうる副作用(+ 1 / -1、init ..のエラー)を回避するために、誰かがrange_iterators(boost)の配列を格納し、処理のためにそれらを反復処理するように提案しましたが、わかりませんrange_iteratorの概念とBoostのドキュメントは、ここではあまり役に立ちませんでした。

Personの属性として2つのアイテム(たとえば、_currentItemと_endItem)を保存し、次のようなチェックを行うと思います。

_currentItem == _endItem

isThereMoreDescriptionToBeProcessed()で、私は次のようなことをするだろうと思います

_currentItem++

processDescription()の最後にありますが、この目的のために_descriptionプロパティの初期化で範囲イテレータの配列を設定する方法と、processDescription()で処理される文字列を取得する方法を理解できません。

これにいくつかのライトを投げてくれてありがとう。

4

1 に答える 1

2

範囲外を作成する2つのイテレーターがある場合、aを作成しboost::iterator_range、2つのイテレーターをコンストラクター引数として渡します。

以下のコードstrは3つの文字セグメントに分割され、各セグメントをにプッシュし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 に答える