C++ 我想反转map的值,并使用基于范围的for循环打印它。
我已经完成了编程,但它没有反转。我使用了不同的映射将值按相反顺序排列,但它仍然显示相同的值。我的主要问题是使用基于范围的循环向后遍历并打印值C++ 我想反转map的值,并使用基于范围的for循环打印它。,c++,visual-studio,C++,Visual Studio,我已经完成了编程,但它没有反转。我使用了不同的映射将值按相反顺序排列,但它仍然显示相同的值。我的主要问题是使用基于范围的循环向后遍历并打印值 #include "stdafx.h" #include <iostream> #include<conio.h> #include <stdio.h> #include<vector> #include<map> #include<utility> #include<set&g
#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 << ")" << " ";
}
#包括“stdafx.h”
#包括
#包括
#包括
#包括
#包括
#包括
#包括
mapm1;
对于(inti=1;i,正如一些程序员指出的,但是为了我的答案的完整性,无论插入元素的顺序如何,std::map
都按键排序。一个选项是创建一个新的map
,排序方式相反,但这似乎不是您真正想要的
似乎您知道反向迭代器的用法,但在使用基于范围的for
时不知道如何使用它们。因为它在一个范围上运行,即提供开始
和结束
迭代器的某种类型,所以您需要在提供此功能的映射
周围创建一些包装器
这是一个我刚刚整理好的通用程序,在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';
}
(您还可以找到提供类似适配器的库;)
此外,请重新考虑您使用的通常被认为是不好的做法:和(这些是解释的链接).正如一些程序员指出的,但是为了我的答案的完整性,无论插入元素的顺序如何,std::map
都按键排序。一个选项是创建一个新的map
,排序方式相反,但这似乎不是您真正想要的
似乎您知道反向迭代器的用法,但在使用基于范围的for
时不知道如何使用它们。因为它在一个范围上运行,即提供开始
和结束
迭代器的某种类型,所以您需要在提供此功能的映射
周围创建一些包装器
这是一个我刚刚整理好的通用程序,在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';
}
(您还可以找到提供类似适配器的库;)
此外,请重新考虑您使用的通常被认为是不好的做法:和(这些是指向解释的链接)。如果您只需要按相反顺序打印地图中的元素,您不需要另一张地图,您可以这样做:
std::map<int, int>::reverse_iterator iter;
for (iter = m1.rbegin(); iter != m1.rend(); ++iter)
{
std::cout << "(" << iter->first << " " << iter->second << ")" << " ";
}
std::map::reverse\u迭代器iter;
对于(iter=m1.rbegin();iter!=m1.rend();++iter)
{
std::cout如果只需要按相反顺序打印映射中的元素,则不需要另一个映射,可以执行以下操作:
std::map<int, int>::reverse_iterator iter;
for (iter = m1.rbegin(); iter != m1.rend(); ++iter)
{
std::cout << "(" << iter->first << " " << iter->second << ")" << " ";
}
std::map::reverse\u迭代器iter;
对于(iter=m1.rbegin();iter!=m1.rend();++iter)
{
std::cout下面是一个向后迭代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;
}
}
#包括
#包括
#包括
int main(){
std::map m;
m[1]=1;
m[2]=2;
m[3]=3;
对于(自动iter=m.rbegin();iter!=m.rend();++iter){
std::cout first下面是一个向后迭代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;
}
}
#包括
#包括
#包括
int main(){
std::map m;
m[1]=1;
m[2]=2;
m[3]=3;
对于(自动iter=m.rbegin();iter!=m.rend();++iter){
std::我不能首先记住它是按键排序的。如果你想反转另一个映射,你必须对键使用反向排序(是的,你可以自定义使用的排序函数)。如果我必须使用基于范围的循环以相反的方式打印映射值,而不使用另一个映射,那么我会说您可能对您的需求进行了非常狭隘的解释。为什么您需要使用基于范围的for
循环?请记住,这是按键排序的。如果您希望反转另一个映射,则必须使用re键的韵文排序(是的,您可以自定义使用的排序功能)。如果我必须使用基于范围的循环以相反的方式打印map的值,而不使用另一个map,那么我会说您可能对您的需求进行了非常狭隘的解释。为什么您需要使用基于范围的for
循环?请注意,问题特别限于使用基于范围的for
@BoBTF是的,我错过了,谢谢你指出:)注意,这个问题特别局限于对
@BoBTFish使用基于范围的,是的,我错过了,谢谢你指出:)谢谢你的解决方案,我一定会采纳你的建议谢谢你的解决方案,我一定会采纳你的建议