对std :: map进行排序

时间:2013-06-23 19:09:17

标签: c++ map vector

我已经定义了这样的地图

typedef   std::vector< int > aVector;
typedef std::map< int, aVector > aMap;
aMap theMap;

假设地图最终包含一些像这样的元素

10 [0 3 7] size=3
12 [40 2 30 3 10] size=5
20 [5 10] size=2
25 [6] size=1

我想对矢量的大小进行排序(例如,map-&gt; second.size())。所以结果将是

5 3 2 1

最快的方法是什么?基本思想是将大小推到另一个向量上,然后调用sort(),就像这样

aVector v, sorted;
aMap::iterator it = theMap.begin();
for (; it != theMap.end(); ++it) {
  v.push_back(it->second.size());
}
// using std sort!!

还有更好的选择吗?

3 个答案:

答案 0 :(得分:1)

为什么不将矢量作为键并使用自定义键比较函数/函数来比较键大小?

您可以在http://www.cplusplus.com/reference/map/map/map/

中查看此示例

我现在还没有访问C ++编译器,但它会是这样的:

#include <map>

struct aComparisonStruct {
    bool operator() (const aVector& lhs, const aVector& rhs) const {
        return lhs.size > rhs.size;
    }
};

int main () {
    typedef std::vector<int> aVector;
    typedef std::map<aVector, int, aComparisonStruct> aMap;

    // Use your map

    return 0;
}

但是存在一个问题:您不能再使用单键存在的属性,并且您将无法多次添加相同的向量。也许另一种实施更合适?

另外,使用指针作为键肯定会更好,但由于我无法编译,我不想混淆指针和引用,并给你一些不太可行的东西。

答案 1 :(得分:1)

当您需要通过std::mapstd::hash_map快速查找并按特定顺序管理它时,有一项非常常见的任务。在这种情况下,您可以在主集合上使用有点“索引”集合:

aMap theMap;
std::map<size_t, std::list<aMap::iterator> > sizes;

// add item
auto r = theMap.insert(key, std::vector<int>());
if (!r->second)
{
    sizes[r->first->second.size()].remove(r->first);
}
r->first->second->push_back(item);
sizes[r->first->second.size()].push_back(r->first);

答案 2 :(得分:0)

标准排序声明为:

void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);

所以你可以传入一个comp:

struct comp {
    bool operator() (const aVector& lhs, const aVector& rhs) {
      return (lhs.size() < rhs.size());
    }
} mycomp;

std::sort(theMap, comp)

请注意,最好将comp作为输入传递,而不是在声明地图时修复它。 在这种情况下,当您只想更改comp时,您不必声明不同的地图。