将map <string,struct =“”>存储到矢量中以进行排序

时间:2016-04-16 01:53:22

标签: sorting dictionary vector struct

我正在尝试以下代码。我试图通过升序或降序大小和z-a(三种不同的排序)对其进行排序。我无法弄清楚如何将它存储在矢量中,更不用说对它进行排序了。谢谢你的帮助!

  struct countSize {
        int count;
        uintmax_t size;

        void sortMap(map<string, countSize> &extCount)
    {
        // Copy 
        vector<string, countSize> v(extCount.begin(), extCount.end());

        // Sort the vector according to either file size or desc alphabetically


        //print

    }

int main()
{
map<string, countSize> mp;
 mp["hello"] = { 1, 200 };
 mp["Ace"] = { 5, 600 };
 mp["hi"] = { 3, 300 };
mp["br"] = { 2, 100 };

sortMap(mp);
}

1 个答案:

答案 0 :(得分:0)

如果您遍历地图,则会获得std::pair<const X, Y>的流。由于const,存储在向量中有点尴尬。一种解决方案是放弃const

using my_map = std::map<std::string, countSize>;
// Mutable element type.
using my_map_element = std::pair<typename my_map::key_type,
                                 typename my_map::mapped_type>;
using my_element_list = std::vector<my_map_element>;

然后,它非常直接地构建一个向量并对其进行排序。在这里,我们使用模板进行比较,这使得lambda更容易用于比较器:

template<typename Functor>
my_element_list sortMap(const my_map& the_map, Functor compare) {
    my_element_list v(the_map.begin(), the_map.end());
    std::sort(v.begin(), v.end(), compare);
    return v;
}

与您的代码不同,它返回已排序的列表。如果需要,呼叫者可以打印列表。例如,请参阅示例live on Coliru

但是,这并不是很理想。如果地图的各个元素都很复杂,那么为元素创建指针的向量可能更有效,而不是元素的副本。除此之外,这不需要重新调整元素类型,这使得可以对基本容器类型进行不可知。但是,您需要记住,比较仿函数现在将接收指向要比较的元素的指针。见the modified example.