如何在unordered_map中获得中值?

时间:2014-09-08 10:39:46

标签: c++ algorithm sorting stl unordered-map

我正在尝试为以下无序映射编写排序算法。我看到this问题,我正在尝试将其用于无序地图,但它无效!

注意 - 我不允许使用任何STL排序功能。

void quickSort(unordered_map<string, int> map, unordered_map<string, int>::iterator left,unordered_map<string, int>::iterator right) {

    unordered_map<string, int>::iterator i=left;
    unordered_map<string, int>::iterator j=right;
    unordered_map<string, int>::iterator pivot = std::advance(map.begin(), map.size() / 2);

    unordered_map<string, int> tmp;
}

int main(){
    unordered_map<string, int> map;
    map["blah"] = 2;
    map["the"] = 5;
    quickSort(map,map.begin(),map.end());
}

2 个答案:

答案 0 :(得分:2)

无序地图没有顺序(顾名思义),因此在无序地图中找到中位数是没有意义的。如果你需要找到中位数 - 使用一个辅助数组并在其中执行一些nth_element算法的实现。这一步将具有线性复杂性。

答案 1 :(得分:2)

正如评论中所述,您无法对unordered_map进行排序,因为其value_typestd::pair<const Key, T> {注释const!)unordered_map<Key,T> 。这意味着您无法在地图中交换元素,因此无法对其进行排序。您需要将数据复制到另一个数据结构中,如矢量,然后您可以使用一些&#34;本土生长的&#34;版本为std::nth_element

std::vector<std::pair<Key,T>> med {map.begin(), map.end()};
my_nth_element(med.begin(), med.end(), med.begin() + med.size() / 2);
auto median = med[med.size()/2];

您应该平均实现具有线性复杂度的nth_element。 (如果输入值的数量恰好是偶数,则需要使用两个中间值的平均值。)