1

假设我有一个std::vector< boost::variant< T1, T2, T3> >,例如请注意,在我的向量中,必须在'a' 之后有两个'b'一个'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}

感谢 boost 访问者,现在我已经分别过滤了每个元素类型 (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;
};

第二次编辑:

换句话说:假设我有一个 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'之后有两个'b' ** 一个'q '。当我调用我的函数时,我知道我收到了一个构造类似于 vec 的向量。然后我有两个函数作为输入“T1,T3”和“T1,T2”。

例如得到 (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 回答