2013-07-18 48 views
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} 

由於升壓遊客,現在我已經過濾設備類型(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) ..

,但我不知道怎麼給他們這些投入。

+2

爲什麼你需要過濾,而不是一個訪問者通過變體矢量,可以檢查不變量? – ForEveR

+2

是的,如果你做了ForEveR說的,但是掃描矢量_backward_(從最後開始,例如使用反向迭代器),你可以很容易地記住最近的'a'的位置,它會告訴你,一旦你發現了一個'q',接下來的'a'是什麼。 – jogojapan

+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

所有這些都不是特別美麗,但是由您來判斷是否有更好的解決方案來解決您的問題。

我不認爲有一個解決方案,如果你真的將元素複製到不同的向量。當原始矢量未排序時,線性搜索是您可以做的最好的。

+0

謝謝,但是當我嘗試實施您的解決方案時,我收到一些錯誤。我想知道如果你測試了你的答案。 –

+0

我修正了一個錯字。它顯然不是C++ 98。它使用你需要用函數替換的lambdas。你得到的錯誤是什麼? – Sebastian