【问题标题】:multimap<vector<int> > ,char> how to sort it?multimap<vector<int> > ,char> 怎么排序呢?
【发布时间】:2018-09-21 15:23:07
【问题描述】:

这是代码,可以编译,但是不能运行,为什么?:

#include <iostream>
#include <map>
#include <vector>
using namespace std;
int main() {
    typedef multimap<vector< int >, char> mmap;

    mmap foo;
    vector<int> v;
    v.push_back(15);
    v.push_back(14);
    foo.insert(pair<vector< int >, char> (v, 'b'));
    v.clear();
    v.push_back(15);
    v.push_back(80);
    foo.insert(pair<vector< int >, char> (v, 'c'));
    v.clear();
    v.push_back(9);
    v.push_back(17);
    foo.insert(pair<vector< int >, char> (v, 'a'));
    v.clear();

    mmap::iterator iter;

    for (int i = 0; i < iter->first.size(); ++i) {
        wcout << iter->first[i] << " ";
        for (iter = foo.begin(); iter != foo.end(); ++iter) {
            wcout << iter->second << " ";
        }
        wcout << endl;
    }
}

输出:

15 80 c

15 14 b

9 月 17 日

我想加上整数,然后排序: (数字从大到小排序

80+15>15+14>9+17

怎么做?

【问题讨论】:

  • 您可以提供使用元素总和的自定义比较器,这是您需要的吗?
  • 这段代码实际上给了你输出?不应该,因为您从未将 iter 设置为有效的迭代器。
  • std::sort 是一个东西,方便地,它可以带一个自定义比较函数。
  • 你真的应该避免using namespace std - 这是一个坏习惯,当你没想到它时can silently change the meaning of your program。习惯于使用命名空间前缀(std 故意很短),或者将只是您需要的名称导入到最小合理范围

标签: c++ sorting vector int multimap


【解决方案1】:

您需要使用自定义比较函数/函子来帮助您。

struct Compare
{
   bool operator()(std::vector<int> const& lhs, std::vector<int> const& rhs) const
   {
      int sum1 = std::accumulate(lhs.begin(), lhs.end(), 0);
      int sum2 = std::accumulate(rhs.begin(), rhs.end(), 0);
      return (sum1 > sum2); // Not sum1 < sum2, if I understood your question
   }
};

并使用:

typedef multimap<vector< int >, char, Compare> mmap;

您还必须修复打印foo 内容的代码。

mmap::iterator iter = foo.begin();
for ( ; iter != foo.end(); ++iter )
{
   for ( size_t i = 0 ; i < iter->first.size() ; ++i ) {
      wcout << iter->first[i] << " " ;
   }
   wcout << iter->second << " " ;
   wcout << endl ;
}

【讨论】:

    【解决方案2】:

    您在内部 for 循环中初始化了 iter:

    for ( iter = foo.begin() ; iter != foo.end() ; ++iter )

    但是,您尝试在外部 for 循环中访问它指向任何内容:

    for ( int i = 0 ; i &lt; iter-&gt;first.size() ; ++i )

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-01
      相关资源
      最近更新 更多