4

repeated fieldGoogle プロトコル バッファに一意の要素のみを含めたい。std::setつまり、 の代わりにとして使用する必要がありstd::vectorます。

それを行うための最も簡単で最も効率的な方法はどれですか?

編集:可能であれば、イテレータを使用してすべての要素をループしたくありません。

4

2 に答える 2

2

質問のコメントにあるように、イテレータを使用せずにこれを行う方法はありません。ただし、他の誰かがこれに興味を持っている可能性があります。これを実現するためにコード化した関数を次に示します。これはパラメータとして a RepeatedPtrField< T >*(リスト) と a std::string(リストに追加する予定の新しいオブジェクトのキー) を取り、id に一致する要素を返しNULLます。RepeatedFieldリスト。

RepeatedFieldこのようにして、他のstd構造を使用せずに、一意の要素のリストを直接簡単に保持できます。

template <class T>
T* repeatedFieldLookup( google::protobuf::RepeatedPtrField< T >* repeatedPtrField, std::string id)
{
   google::protobuf::internal::RepeatedPtrOverPtrsIterator<T> it = repeatedPtrField->pointer_begin();
   for ( ; it != repeatedPtrField->pointer_end() ; ++it )
   {
      CommonFields * commonMessage = (CommonFields*) (*it)->GetReflection()->
     MutableMessage ((*it), (*it)->GetDescriptor()->FindFieldByName ("common"));
      if(commonMessage->id() == id)
      {
     return *it;
      }
   }
   return NULL;
}

:上記の例では、プロトメッセージには常にというフィールドがありますcommon(私の場合はプロトメッセージでもあります)。これは、proto メッセージから比較したいものに置き換えることができます。

于 2013-04-11T09:43:25.983 に答える