我想反转map的值并使用基于范围的循环打印它。

时间:2017-04-13 06:16:42

标签: c++ visual-studio

我已完成编程,但它没有反转。我使用了不同的映射来以相反的顺序放置值,但它仍然显示相同。我的主要问题是向后遍历并使用基于范围的循环打印值。

#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 << ")" << "  ";
    }

3 个答案:

答案 0 :(得分:2)

正如一些程序员Dude指出的那样,但是为了我的答案的完整性,无论你插入元素的顺序是什么,std::map都会在键上排序。一种选择是创建一个具有相反排序的新map,但这似乎不是你真正想要的。

看来你知道反向迭代器怎么样,但是在使用基于范围的for时却不知道怎么做。由于它在范围上运行,即某种提供beginend迭代器的类型,因此您需要在map周围创建一个提供此内容的包装器。< / p>

这是我刚刚放在一起的一般而不是在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 is working on a ranges library for The Standard。)

此外,请重新考虑您对通常被视为不良做法的使用:using namespace std;endl(这些是解释的链接)。

答案 1 :(得分:2)

这是一个向后迭代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;
}

答案 2 :(得分:0)

如果您只需要以相反的顺序打印地图中的元素,则不需要另外的地图,您可以这样做:

    std::map<int, int>::reverse_iterator iter;

    for (iter = m1.rbegin(); iter != m1.rend(); ++iter)
    {
        std::cout << "(" << iter->first << "  " << iter->second << ")" << "  ";
    }