我想反转地图的值并使用基于范围的 for 循环打印它
I want to reverse the values of map and print it using range based for loop.
我已经完成了编程,但它没有逆转。我使用了不同的地图以相反的顺序放置值,但它仍然显示相同。我的主要问题是使用基于范围的循环向后遍历并打印值。
#include "stdafx.h"
#include <iostream>
#include<conio.h>
#include <stdio.h>
#include<vector>
#include<map>
#include<utility>
#include<set>
map<int, int>m1;
for (int i = 1; i <= 100; ++i)
{
m1.insert({ i,i });
}
for (const auto &y :m1)
{
cout <<"("<< y.first << " "<<y.second << ")" <<" " ;
}
cout << endl << endl;
map<int, int>m2;
map<int, int>::reverse_iterator iter;
for (auto iter = m1.rbegin(); iter != m1.rend(); ++iter)
{
m2.insert({ iter->first,iter->second });
}
for (const auto &y : m2)
{
cout << "(" << y.first << " " << y.second << ")" << " ";
}
正如一些程序员指出的那样,但为了我答案的完整性,无论您以何种顺序插入元素,都会在键上排序std::map
。一种选择是创建一个具有相反排序的新map
,但这似乎不是您真正想要的。
您似乎知道如何使用反向迭代器,但不知道如何在使用基于范围的for
时使用它。由于它在一个范围上运行,即提供begin
和end
迭代器的某种类型,您需要围绕提供此map
创建一些包装器。
这是我刚刚整理的一个比 C++11 中的作品更一般的。它不会涵盖所有可能的情况,并且可以在 C++14 中变得更整洁,但它会为你工作。
#include <iostream>
#include <iterator>
// The wrapper type that does reversal
template <typename Range>
class Reverser {
Range& r_;
public:
using iterator_type = std::reverse_iterator<decltype(std::begin(r_))>;
Reverser(Range& r) : r_(r) {}
iterator_type begin() { return iterator_type(std::end(r_)); }
iterator_type end() { return iterator_type(std::begin(r_)); }
};
// Helper creation function
template <typename Range>
Reverser<Range> reverse(Range& r)
{
return Reverser<Range>(r);
}
int main()
{
int vals[] = {1, 2, 3, 4, 5};
for (auto i : reverse(vals))
std::cout << i << 'n';
}
这输出:
$ ./reverse
5
4
3
2
1
(您还可以找到提供类似适配器的库;Eric Niebler 正在为 The Standard 开发一个范围库。
另外,请重新考虑您对通常被认为是不良做法的使用:using namespace std;
和endl
(这些是解释的链接)。
下面是一个向后迭代 std::map 的示例:
#include <iostream>
#include <map>
#include <string>
int main() {
std::map<int, int> m;
m[1] = 1;
m[2] = 2;
m[3] = 3;
for (auto iter = m.rbegin(); iter != m.rend(); ++iter) {
std::cout << iter->first << ": " << iter->second << std::endl;
}
}
如果你是 C++11 之前,你只需要拼写出 auto,即:
std::map<int, int>::reverse_iterator
如果您使用的是 boost,则可以将基于范围的 for 循环与反向适配器一起使用:
#include <boost/range/adaptor/reversed.hpp>
for (auto& iter : boost::adaptors::reverse(m)) {
std::cout << iter.first << ": " << iter.second << std::endl;
}
如果你只需要以相反的顺序打印地图中的元素,你不需要另一个地图,你可以这样做:
std::map<int, int>::reverse_iterator iter;
for (iter = m1.rbegin(); iter != m1.rend(); ++iter)
{
std::cout << "(" << iter->first << " " << iter->second << ")" << " ";
}
相关文章:
- 在基于范围的for循环中使用结构化绑定声明
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 基于范围的 for 循环:迭代使用一个元素扩展的向量
- 基于范围的 for 循环unordered_map和引用
- C++基于范围的 for 循环和元素副本
- 实现基于链表的堆栈的基于范围的 for 循环
- 在基于范围的 for 循环期间插入 std::list 的后面
- 基于范围的 for 循环range_declaration中各种说明符之间的性能差异
- 避免在基于反向范围的for循环实现中悬挂参考
- C++ - 使用基于范围的 for 循环将字符值分配给向量中的字符串不会分配值
- 转到基于范围的 for 循环中的下一个迭代器
- 使用基于数组和范围的 For 循环替换一些基本代码行
- C++:返回一个基于范围 for 循环迭代器,其中包含继承对象
- 布尔值向量的基于范围 for 循环
- 在 c++ 中基于范围的 for 循环中使用引用作为控制变量
- C++11 基于范围的 for 循环,用于 std::list
- 堆分配数组的基于范围的 for 循环
- 关于在向量向量上使用基于范围的 for 循环
- 如何使用基于范围的for循环迭代Rapidjson文档(它本身就是一个JSON数组)
- 使用基于范围的for循环取消对矢量指针的引用