讓我們說我有一個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}
由於升壓遊客,現在我已經過濾設備類型(T)分別:
veca= {a, a, a, a, a}
vecb= {b, b, b, b}
vecq= {q, q, q}
現在我要循環「vecq」,每個成員發現在指數'vec'向量,然後通過找到這個索引,我可以在'vec'中找到這個'q'後面的'a'的索引,最後在'veca'中找到'a'的索引。
我知道這是spiry問題,我正在尋找一種簡單的方法(比遍歷向量更快)。
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 < 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'是不同的,你不知道他們混合的方式。你唯一knowis,在我的矢量它是有義務2 「B」 * 或 *後「A」一個「Q」。 當我打電話給我的函數時,我知道我收到了一個類似於vec構造的向量。那麼我有兩個函數作爲輸入「T1,T3」和「T1,T2」。
例如,得到(A1,B15,B1)或(A5,Q0)或(A5,Q1)或(A9,B7,B6)或 ..
,但我不知道怎麼給他們這些投入。
爲什麼你需要過濾,而不是一個訪問者通過變體矢量,可以檢查不變量? – ForEveR
是的,如果你做了ForEveR說的,但是掃描矢量_backward_(從最後開始,例如使用反向迭代器),你可以很容易地記住最近的'a'的位置,它會告訴你,一旦你發現了一個'q',接下來的'a'是什麼。 – jogojapan
@感謝您的意見,但我需要這些載體,因爲我必須將它們傳遞給其他用途的代碼的其他部分。 –