我特别感兴趣的是通过非重复的键反向循环:
#include <map>
#include <iostream>
std::multimap<int,int> myMap = {
{1,2}, {1,2}, {2,2}, {2,2}, {3,2},
};
int main() {
using namespace std;
cout << "the keys backwards:" << endl;
typedef multimap<int, int> multimap_type;
typedef std::reverse_iterator<multimap_type::iterator> reverse_iterator;
for (auto it = myMap.rbegin(), end = myMap.rend(); it != end; it = reverse_iterator(myMap.lower_bound(it->first)))
{
cout << it->first << endl;
}
}
正如你所看到的,我必须重复三次多图名称。我可以编写自己的函数来处理所有这些,然后简单地调用while或range for循环吗?像那样:
while( (auto it = myIterFunc(myMap)) {
//...
}
for ( auto it : myIterFunc(myMap)) {
//...
}
答案 0 :(得分:2)
for ( auto it : myIterFunc(myMap)) {
名称it
和myIterFunc
意味着您对新的基于范围的for
循环感到困惑。变量it
不是迭代器,它是范围的元素。函数myIterFunc
不应该返回迭代器,它应该返回一个看起来像一个范围的东西,即有begin()
和end()
成员,允许迭代所需的范围。
您可以使用Boost.Range适配器在reverse中循环播放:
#include <boost/range/adaptors.hpp>
for (auto& val : boost::adaptors::reverse(myMap))
cout << val.first << endl;
您可以将其与filter adaptor结合使用以跳过重复的键。 (有一个uniqued adaptor,但它使用==
来确定唯一性,而不是只检查键)