如何使用 boost :: 适配器链的 boost 范围获取 std::list
Posted
技术标签:
【中文标题】如何使用 boost :: 适配器链的 boost 范围获取 std::list【英文标题】:How use boost range of boost :: adaptors chain get std::list 【发布时间】:2016-09-02 23:47:09 【问题描述】:我要完成以下功能
#include <algorithm>
#include <iostream>
#include <list>
#include <map>
#include <boost/foreach.hpp>
#include <boost/range/begin.hpp>
#include <boost/range/end.hpp>
#include <boost/range/algorithm.hpp>
#include <boost/range/algorithm_ext.hpp>
#include <boost/range/adaptors.hpp>
#include <boost/utility.hpp>
struct X
X(int n, int m)a=n; b=m;
int a;
int b;
;
int main(int argc, char* argv[])
std::list<X> lstPP;
std::list<std::pair<int, std::list<X>>> lstYY;
X x1(1, 2);
X x2(3, 4);
X x3(4, 5);
X x4(5, 6);
X x5(6, 7);
X x6(7, 8);
std::list<X> lstA;
lstA.push_back(x1);
lstA.push_back(x2);
lstYY.push_back(std::make_pair(1, lstA));
std::list<X> lstB;
lstB.push_back(x3);
lstB.push_back(x4);
lstYY.push_back(std::make_pair(6, lstB));
std::list<X> lstC;
lstC.push_back(x5);
lstC.push_back(x6);
lstYY.push_back(std::make_pair(2, lstC));
std::list<X> lstD;
lstD.push_back(x4);
lstD.push_back(x2);
lstYY.push_back(std::make_pair(6, lstD));
int m1 = 6;
//BOOST_FOREACH(BOOST_IDENTITY_TYPE((std::pair<int, std::list<X>>)) value, lstYY)
//
// if(value.first == m1)
//
// boost::push_back(lstPP, value.second);
//
//
boost::push_back(lstPP, lstYY
| boost::adaptors::filtered(boost::bind(&std::pair<int, std::list<X>>::first, _1) == m1)
| boost::adaptors::transformed(boost::bind(&std::pair<int, std::list<X>>::second, _2)));
return 0;
我想用boost::adaptors链应该怎么做
boost::push_back(lstPP, lstYY
| boost::adaptors::filtered(boost::bind(&std::pair<int, std::list<X>>::first, _1) == m1)
| boost::adaptors::transformed(boost::bind(&std::pair<int, std::list<X>>::second, _2)));
而不是
BOOST_FOREACH(BOOST_IDENTITY_TYPE((std::pair<int, std::list<X>>)) value, lstYY)
if(value.first == m1)
boost::push_back(lstPP, value.second);
但是应用vs2010编译出错:
error C2664: 'void std::list<_Ty>::_Insert(std::_List_const_iterator<_Mylist>,const _Ty &)' : cannot convert parameter 2 from 'const std::list<_Ty>' to 'const X &'
1> with
1> [
1> _Ty=X,
1> _Mylist=std::_List_val<X,std::allocator<X>>
1> ]
1> and
1> [
1> _Ty=X
1> ]
怎么解决?顺便不能用c++0x lambda,谢谢
【问题讨论】:
如果有人感兴趣,this 是重现错误的完整示例。 【参考方案1】:您的算法在性能方面存在问题——您有一个已排序的容器,但您对键进行了线性搜索。相反,这段代码更简单、更快(O(log n) 而不是 O(n)):
std::list<X> lstPP;
typedef std::map<int, std::list<X>> map_t;
map_t mapYY;
int m1 = 9;
map_t it = mapYY.find(m1);
if (it != mapYY.end())
lstPP.push_back(it->second);
【讨论】:
谢谢你,但我可能不知道我要发帖的表达的意思以上是关于如何使用 boost :: 适配器链的 boost 范围获取 std::list的主要内容,如果未能解决你的问题,请参考以下文章