std::vector< boost::variant< T1, T2, T3> > があるとしましょう。たとえば、私のベクトルでは、「a」の後に 2 つの「b」または1 つの「q」が必要であることに注意してください。
これらの 'a'、'b'、および 'q' は異なっており、これらがどのように混ざり合っているかはわかりません。
std::vector< boost::variant< T1, T2, T3> > vec;
vec = {a, b, b, a, q, a, q, a, b, b, a, q}
ブースト ビジターのおかげで、各要素の種類 (T) を個別にフィルター処理できるようになりました。
veca= {a, a, a, a, a}
vecb= {b, b, b, b}
vecq= {q, q, q}
今、私は 'vecq' をループし、各メンバーに対して 'vec' ベクトルのインデックスを見つけ、このインデックスを見つけることで、'vec' のこの 'q' の後ろにある 'a' のインデックスを見つけることができます。最後に、「veca」で「a」のインデックスを見つけます。
私はそれがスパイシーな質問であることを知っています。私は簡単な方法を探しています(ベクトルを反復処理するよりも高速です)。
PS私はc ++ 98標準を使用しています
編集:
利用したビジター
template<typename T>
struct T_visitor : public boost::static_visitor<>
{
T_visitor(std::vector<T>& v) : vec(v) {}
template<typename U>
void operator () (const U&) {}
void operator () (const T& value)
{
vec.push_back(value);
}
private:
std::vector<T>& vec;
};
2番目の編集:
つまり、 std::vector< boost::variant< T1, T2, T3> > があるとしましょう。
std::vector< boost::variant< T1, T2, T3> > vec;
vec = {a1, b15, b1, a5, q0, a5, q1, a9, b7, b6, a4, q2}
これらの 'a'、'b'、および 'q' は異なっており、これらがどのように混ざり合っているかはわかりません。あなたが知っている唯一のことは、私のベクトルでは 'a' の後に2 つの 'b' *または* 1 つの' q'を持つ義務があるということです。関数を呼び出すと、vec と同様に構築されたベクトルを受け取ることがわかります。次に、入力として「T1、T3」と「T1、T2」を取得する2つの関数があります。
たとえば、(a1, b15,b1)または(a5, q0)または(a5, q1)または(a9, b7,b6)または..
しかし、これらの入力を与える方法がわかりません。