2013-07-16 3 views
2

Я ищу наилучший способ фильтрации вектора варианта наддува, который был определен, как это:фильтровать вектор форсированного варианта в новый вектор?

boost::variant<T1*, T2, T3> Var; 
std::vector<Var> Vec; 

, когда я называю этот вектор, то, что является лучшим способом для фильтрации только T2 ограниченного типа и вставки в новый вектор? или другим способом, я хочу что-то вроде этого

std::vector<T2> T2Vec = ...(how to filter it from Vec).... 

спасибо!

EDIT: Поскольку использование «посетителя» более надежное, мне также интересно, чтобы кто-нибудь мог дать мне решение, используя «посетителя»?

еще раз спасибо!

+0

Вы можете использовать подобный подход, как juanchopanza изначальном, используя 'станд :: remove_copy_if' и функтор, который возвращает true, когда 'v.which()! = 1'. – llonesmiz

+1

@cv_and_he, к сожалению, мой первоначальный подход ошибочен: нет оператора преобразования от 'Var' до' T2'. Нужен алгоритм 'transform_if', которого не существует. Я вернулся к простой петле. – juanchopanza

ответ

4

Простейшим решением было бы перебрать Vec, проверив, является ли элемент double, затем нажмите двойным на T2Vec. Это версия С ++ 03:

for (std::vector<Var>::const_iterator it = Vec.begin(); it != Vec.end(); ++it) 
{ 
    if (it->which() == 1) T2Vec.push_back(boost::get<T2>(*it)); 
} 

C++ 11 версия:

for (const auto& v : Vec) 
{ 
    if (v.which() == 1) T2Vec.push_back(boost::get<T2>(v)); 
} 
+0

спасибо, почему вы определяете vec2, что такое «v»? –

+0

@ H'H извините, 'Vec2' должен быть' T2Vec'. 'v' является элементом' Vec'. – juanchopanza

+0

спасибо, но, к сожалению, std-версия, с которой я работаю, не поддерживает std :: copy_if –

Смежные вопросы