2

編集:あきらめます!私はfor (string& word : sentence) { .. }今代わりに単純に使用しています。BOOST_FOREACH絶望的です。ありがとうございました。

私はこれとこれを読みましたがまったく役に立ちませんでした。特に2つ目のリンクについてお聞きしたいです。名前空間の下にいくつかの奇妙な構造体を定義する必要があるのはなぜboostですか? BOOST_FOREACH を有効にしたいクラスは、自分の名前空間で定義されています。でイテレータを定義した場合、そのクラスからデータにアクセスするにはどうすればよいnamespace boost { .. }ですか? これは意味がありません。IEnumerableC++ で の同等性を見つけるのになぜそんなに時間がかかったのかわかりません! boost私の時間を節約したくないですか?

このクラスを反復処理する最も適切な方法を教えてください。

class Sentence {
private:
    vector<string> words;
}

このコードで:

Sentence sentence;
BOOST_FOREACH(string word, sentence) {
    // ..
}

ありがとう。

4

1 に答える 1

3

ドキュメントによると、標準ライブラリ コンテナーのように見えるものはすべて機能します。最も簡単な方法は、クラスで反復子のペアを公開することです。独自のものを実装したくない場合は、単純にvector<string>イテレータを使用してください。

class Sentence 
{
public:
  typedef vector<string>::iterator iterator;
  typedef vector<string>::const_iterator const_iterator;
  const_iterator begin() const { return words.begin(); }
  const_iterator end() const { return words.end(); }
private:
    vector<string> words;
};

編集は、標準ライブラリのコンテナのような型を理解するほど賢くはないようBOOST_FOREACHですが、標準ライブラリのイテレータのペアを理解することはできます。したがって、追加の手順が必要です。

#include <iostream>
#include <utility>
int main()
{
  Sentence sentence;
  auto s = std::make_pair(sentence.begin(), sentence.end());
  BOOST_FOREACH(std::string word, s) {
    std::cout << word << std::endl;
  }
}

注 1: type erase を使用して反復子の明示的な型を分離したい場合がありますが、それは改良と見なすことができます。詳細については、この関連するディスカッションを参照してください。

注 2: 私は の大ファンではありませんでしたBOOST_FOREACH。C++11 の範囲ベースのループにより、実際のコードで使用する可能性はさらに低くなります。

于 2013-12-26T05:29:17.567 に答える