让我说我有一个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>或 ..
但我不知道如何给他们这些输入。
答案 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
。
所有这些并不是特别漂亮,但是由您来判断是否有更好的解决方案来解决您的问题。
如果您真的将元素复制到不同的向量中,我认为没有解决方案。如果未对原始矢量进行排序,则可以执行线性搜索。