2016-07-27 81 views
1

假設我有std :: pair的STL容器。 有沒有什麼辦法使用boost來適應pair對STL算法lambda的第二個方法?適應STL算法的std :: pair lambda

std::vector<std::pair<int, SomeStruct>> vec; 
const auto Predicate = [](SomeStruct const& s) { ... }; 
auto it = std::find_if(vec.begin(), vec.end(), boost-magic(Predicate)); 

回答

2

使用頭boost/range/algorithm/find_if.hppboost/range/adaptor/transformed.hpp你可以使用:

auto it = boost::find_if(vec | boost::adaptors::transformed(
    [](std::pair<int, SomeStruct>& p){ return p.second; }),Predicate); 

我不知道的東西比[](std::pair<int, MyClass>& p){ return p.second; }短。原始std::get<1>在此上下文中不起作用,因爲它不是函子。使用此功能,並提升可以使用boost::phoenix::at_c<0>(boost::phoenix::arg_names::arg1)獲取函數訪問對的first成員和boost::lambda::bind(Predicate,boost::lambda::_1)使Predicate一起工作:但我的C++ 14編譯器還接受了表達[](auto& p){ return std::get<1>(p); }[](auto& p){ return p.second; }

更新::拉姆達的逗號操作符重載這兩個結合:

auto it = boost::find_if(vec, (boost::lambda::bind(Predicate,boost::lambda::_1),boost::phoenix::at_c<0>(boost::phoenix::arg_names::arg1)));  

但我不會稱之爲「提高魔法」,它更像是使事情複雜不必要的。

+0

我見過類似的東西使用boost :: arg1與std :: vector 。我真的不知道arg1是如何工作的,但我想知道它是否可以用來適應std :: pair。 – JobNick

6

無需提升。你可以簡單地寫一個lambda,或命名函數對象:

const auto Predicate2 = [&Predicate](std::pair<int, SomeStruct> const& s) { 
    return Predicate(s.second); 
}; 
auto it = std::find_if(vec.begin(), vec.end(), Predicate2); 

當然,如果Predicate在此一例只使用過的,那麼它會更有意義,將其寫入直接接受一對。

相關問題