2016-10-10 40 views
3

说我有类似的具体项目:遍历列表中的用C一对(或元组)++

using MyList = std::list<std::pair<string,int>>; 

我怎样才能获取列表的迭代器只是字符串(或整数)?我有一个功能,我想通过东西 .begin()和东西 .end(),这只是整数。有没有一个简单/聪明/光滑的方式来做到这一点?它也可以用元组来完成吗?

+0

我不知道是否有这样做的标准方式,但你可以编写自己的迭代器适配器。 – NathanOliver

回答

4

有升压的transform_iterator

using MyList = std::list<std::pair<string,int>>; 

MyList l{ {"Hello", 42}, {"World", 0} }; 

auto tr = [](auto const& p){ 
    return p.first; 
}; 

copy(boost::make_transform_iterator(l.begin(), tr), 
    boost::make_transform_iterator(l.end(), tr), 
    ostream_iterator<string>(cout, ", ")); 

live example

3

随着range-v3,你可以做这样的事情

std::list<std::pair<std::string, int>> pairs = {{"John", 2}, {"Hello", 42}}; 

auto names = pairs | ranges::view::keys; 
auto ints = pairs | ranges::view::values; 
auto doubleInts = pairs | ranges::view::transform([](const auto& p){ return 2 * p.second; }; 
+0

什么是'name'和'ints'?它们是轻量级视图还是全部序列? – krzaq

+1

@krzaq:它们是轻量级的视图(如'doubleInts')。 – Jarod42