将boost变体的向量过滤成新的向量?
Posted
技术标签:
【中文标题】将boost变体的向量过滤成新的向量?【英文标题】:filter a vector of boost variant into a new vector? 【发布时间】:2013-07-16 08:02:43 【问题描述】:我正在寻找过滤 boost 变体向量的最佳方法,其定义如下:
boost::variant<T1*, T2, T3> Var;
std::vector<Var> Vec;
当我调用此向量时,仅过滤 T2 有界类型并插入新向量的最佳方法是什么? 或者以其他方式,我想要这样的东西
std::vector<T2> T2Vec = ...(how to filter it from Vec)....
谢谢!
编辑: 由于使用“visitor”更健壮,我也想知道有人可以给我一个使用“visitor”的解决方案吗?
再次感谢!
【问题讨论】:
您可以使用与 juanchopanza 的原始方法类似的方法,使用std::remove_copy_if
和一个在 v.which()!=1
时返回 true 的函子。
@cv_and_he 不幸的是,我最初的方法是有缺陷的:没有从Var
到T2
的转换运算符。需要的是transform_if
算法,但它并不存在。我恢复到一个普通的循环。
【参考方案1】:
最简单的解决方案是循环Vec
,检查元素是否为double
,然后将双精度值推入T2Vec
。这是一个 C++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));
【讨论】:
@H'H 对不起,Vec2
应该是 T2Vec
。 v
是 Vec
的一个元素。
谢谢,但不幸的是,我正在使用的 std 版本不支持 std::copy_if
@H'H 我用一个简单的 C++03 兼容循环替换了我以前的版本。
亲爱的 juanchopanza,我阅读了 boost 教程,提到使用 boost::get以上是关于将boost变体的向量过滤成新的向量?的主要内容,如果未能解决你的问题,请参考以下文章