迭代 C++ 列表中一对(或元组)的特定项
Iterating over specific items of a pair (or tuple) in a list in C++
假设我有类似的东西:
using MyList = std::list<std::pair<string,int>>;
如何获得仅指向列表的字符串(或整数)的迭代器?我有一个函数,我想传递 something.begin() 和 something.end() 这只是整数。有 easy/clever/slick 的方法吗?也可以用元组来完成吗?
有 Boost 的 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, ", "));
使用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; };
假设我有类似的东西:
using MyList = std::list<std::pair<string,int>>;
如何获得仅指向列表的字符串(或整数)的迭代器?我有一个函数,我想传递 something.begin() 和 something.end() 这只是整数。有 easy/clever/slick 的方法吗?也可以用元组来完成吗?
有 Boost 的 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, ", "));
使用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; };