1

データ構造を使用してライブラリを作成しています: std::vector<std::string>. API を満たす必要があります。つまり、データ構造を反復処理するには、ユーザーは次のことを行う必要があります。

for (lib::result::const_iterator it = data.begin(); it != data.end(); it++)

lib::result::const_iteratorこれを行うには、自分で実装する方法と から継承する方法の 2 つがあり、std::vector<std::string>::iteratorどちらも機能するはずです。ベクトル反復子からの継承は悪い考えだと読みました。

Boost iterator ファサードを使用することにしましたが、これは良い考えですか? また、実装に問題があります increment()。std::vector 内の文字列へのポインターがある場合、次の文字列を指すにはどうすればよいですか?

最後に、私の実装は からstd::vector<std::string>に変更される可能性がstd::vector<MyDatatype>あるため、boost ファサードを使用したいと思います。これにより、データ構造に変更を加えることになった場合でも、作業が簡単になります。ありがとう。

4

2 に答える 2

2

ベクトルイテレータを使用できます:

class MyClass
{
     typedef std::vector<std::string>  MyData;

     MyData    data;

     public:
         typedef  MyData::iterator       iterator;
         typedef  MyData::const_iterator const_iterator;

         iterator       begin()       {return data.begin();}
         const_iterator begin() const {return data.begin();}

         .... etc
于 2013-03-07T15:09:15.257 に答える
1
namespace lib {
  struct class {
    typedef std::vector<std::string>::const_iterator const_iterator;
    const_iterator begin() const;
    const_iterator end() const;
  };
};

基になる型を変更する場合は、反復子が反復子と互換性があると仮定してstd::vector<std::string>、typedef を変更するだけです。std::vector<std::string>イテレータと互換性がない場合は、API が壊れています。ただし、これは実際には別の日の問題です。

イテレータを実装する必要がある場合は、boost の「イテレータ アダプタ」が適切な選択std::vector<std::string>です。イテレータを自分のものでラップします。

「イテレータ ファスケード」は、ライブラリ バージョンの変更に対して安定したバイナリ インターフェイスを生成する必要がある場合に使用する可能性があるものです。その場合、私の「イテレーター ファサード」は、ファサードの各機能を実装するpImplタイプのvirtualインターフェイス (「イテレーター ファサード」がその実装から必要とするメソッドを繰り返す) に転送します。内部pImpl実装は、std::vector<std::string>「イテレータ アダプタ」の動作と同様の方法でメソッドを に転送します。しかし、ほとんどの場合、これはやり過ぎです。

しかし、typedef を使用する最初のケースstd::vector<std::string>::const_iteratorは、最も効率的で実装が簡単です。

于 2013-03-07T15:09:14.210 に答える