获取基于另一个向量构造的向量成员的索引

时间:2013-07-18 08:02:52

标签: c++ boost vector stl boost-variant

让我说我有一个std :: vector<升压::变体LT; 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}

感谢提升访问者,我没有分别过滤每种元素类型(T):

veca= {a, a, a, a, a}
vecb= {b, b, b, b}
vecq= {q, q, q}

现在我想循环'vecq',并且每个成员在'vec'向量中找到索引然后通过找到这个索引,我能够在这个'q'后面找到'a'的索引'vec'并最终在'veca'中找到'a'的索引。

我知道这是一个棘手的问题,我正在寻找一种简单的方法(比通过向量迭代更快)。

P.S。我使用的是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&lt;升压::变体LT; T1,T2,T3> &gt;,例如

std::vector< boost::variant< T1, T2, T3> > vec; 
vec = {a1, b15, b1, a5, q0, a5, q1, a9, b7, b6, a4, q2}

请注意,这些'a','b'和'q'是不同的,你不知道它们混合的方式。你唯一知道的是,在我的向量中,'b' * *一个'q'之后的义务> 'A'即可。 当我调用我的函数时,我知道我收到了一个类似于vec构造的向量。然后我有两个函数作为输入“T1,T3”和“T1,T2”。

例如得到(a1,b15,b1)(a5,q0)(a5,q1)(a9,b7,b6)< strong>或 ..

但我不知道如何给他们这些输入。

1 个答案:

答案 0 :(得分: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

所有这些并不是特别漂亮,但是由您来判断是否有更好的解决方案来解决您的问题。

如果您真的将元素复制到不同的向量中,我认为没有解决方案。如果未对原始矢量进行排序,则可以执行线性搜索。