repeated field
Google プロトコル バッファに一意の要素のみを含めたい。std::set
つまり、 の代わりにとして使用する必要がありstd::vector
ます。
それを行うための最も簡単で最も効率的な方法はどれですか?
編集:可能であれば、イテレータを使用してすべての要素をループしたくありません。
repeated field
Google プロトコル バッファに一意の要素のみを含めたい。std::set
つまり、 の代わりにとして使用する必要がありstd::vector
ます。
それを行うための最も簡単で最も効率的な方法はどれですか?
編集:可能であれば、イテレータを使用してすべての要素をループしたくありません。
質問のコメントにあるように、イテレータを使用せずにこれを行う方法はありません。ただし、他の誰かがこれに興味を持っている可能性があります。これを実現するためにコード化した関数を次に示します。これはパラメータとして 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 メッセージから比較したいものに置き換えることができます。