boost :: transform()只有在添加的值不是NULL的情况下?

时间:2014-03-31 19:26:30

标签: c++ boost boost-phoenix boost-range

我有以下代码:

// For each trigger model (_1) (which is just a CString), do:
//    m_triggers.push_back(triggers.GetTrigger(static_cast<char const*>(_1)))
boost::transform(
   model.Triggers(),
   std::back_inserter(m_triggers),
   phx::bind(&CTriggerController::GetTrigger, phx::ref(triggers),
      phx::static_cast_<char const*>(_1)));

m_triggers是触发对象的指针向量:

std::vector<CTrigger*> m_triggers;

如果对CTriggerController::GetTrigger()的调用返回NULL(这意味着找不到该名称的触发器),我不想向我的m_triggers向量推送任何内容。

通过对我上面的代码进行一些小修改,有没有直接的方法呢?

我在MSVC9上使用Boost 1.55.0(仅限C ++ 03)

2 个答案:

答案 0 :(得分:4)

您可以同时使用Boost.Range进行转换和过滤。

#include <vector>
#include <iostream>

#include <boost/range.hpp>
#include <boost/range/adaptors.hpp>
#include <boost/range/algorithm.hpp>

int main()
{
  int data[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
  std::vector<int> out;
  using boost::adaptors::filtered;
  using boost::adaptors::transformed;
  boost::copy(data | transformed([](int x) { return x + 1; }) 
                   | filtered([](int x) { return x % 2 == 0; }),
              std::back_inserter(out));
  for(auto x : out) {
    std::cout << x << std::endl;
  }

  return 0;
}

应该更适合您的用例:

boost::copy(
   model.Triggers() | transformed(phx::bind(&CTriggerController::GetTrigger, phx::ref(triggers),
                        phx::static_cast_<char const*>(_1)))
                    | filtered(phx::val(phx::placeholders::_1)),
   std::back_inserter(m_triggers)
   );

答案 1 :(得分:0)

首先使用std:remove_copy_if复制到临时容器,并在GetTrigger() == NULL时删除谓词,然后进行转换。