1

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)または..

しかし、これらの入力を与える方法がわかりません。

4

1 に答える 1

0

ベクトルを別のベクトルに分割する必要はないかもしれません。

auto rngq = boost::adaptors::filter( vec, 
    []( boost::variant<T1, T2, T3> const& v ) {
        return v.which()==boost::variant<T1, T2, T3>::type<T3>::index;
    }); // rngq is now a range over type T3

これで、ベクトル インデックスを反復しrngqて計算できます。

boost::for_each(rngq, [](boost::variant<T1, T2, T3> const& t3) {
    // The standard guarantees that the vector elements 
    // are put into sequential memory
    ptrdiff_t index = &t3 - &vec[0]; 
});

何らかの理由で要素を別々のベクトルに分割したい場合は、それらを別々の に分割する限り、同じトリックを使用できますstd::vector< boost::variant<T1,T2,T3>*>。もちろん、この解決策では、元のベクトルを維持する必要がありますvec

これらすべてが特に美しいわけではありませんが、問題に対するより良い解決策があるかどうかを判断するのはあなた次第です。

要素をそれぞれ別のベクトルに本当にコピーする場合、解決策はないと思います。元のベクトルがソートされていない場合は、線形検索が最適です。

于 2013-07-18T09:36:23.843 に答える