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使用基于范围的
,是的,我错过了,谢谢你指出:)谢谢你的解决方案,我一定会采纳你的建议谢谢你的解决方案,我一定会采纳你的建议