我正在尝试以下代码。我试图通过升序或降序大小和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);
}
答案 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.