将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 不幸的是,我最初的方法是有缺陷的:没有从VarT2 的转换运算符。需要的是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 应该是 T2VecvVec 的一个元素。 谢谢,但不幸的是,我正在使用的 std 版本不支持 std::copy_if @H'H 我用一个简单的 C++03 兼容循环替换了我以前的版本。 亲爱的 juanchopanza,我阅读了 boost 教程,提到使用 boost::get,错误只能在运行时检查时检测到,我也可以使用 bood::apply 访问者以获得更可靠的结果?

以上是关于将boost变体的向量过滤成新的向量?的主要内容,如果未能解决你的问题,请参考以下文章

提升变体复制语义

dplyr 过滤器:值包含在向量中

根据子字符串的长度过滤一维字符向量

基于具有“容差”的数值向量过滤数据框

如何防止从非常量访问指针中过滤指针向量的函数?

如何根据外部向量过滤表的行?