我有以下代码:
// 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)
答案 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
时删除谓词,然后进行转换。