如何找到地图的中间元素? STL

时间:2011-06-10 07:30:04

标签: c++ algorithm

您好我陷入了STL Library / C ++中Map的概念。

int arr[] = {10,15,14,13,17,15,16,12,18,10,29,24,35,36};
int n = sizeof arr / sizeof *arr;

map<int, bool> bst;
map<int, bool>::iterator it;
vector<int> median_output;

const int k = 5;
for (int i = 0; i < k; ++i) {
    bst.insert(make_pair(arr[i], true));
}

for (it = bst.begin(); it != bst.end(); it++) {
    cout << (*it).first << " ";
}

现在当我打印这张地图时,它按照排序顺序打印。现在有任何最简单的方法来找到这张地图的中间..... 需要找到更大问题的中位数...所以试图实现平衡二叉搜索树..

4 个答案:

答案 0 :(得分:5)

map 平衡搜索树。找到它的中间 - 找到它的大小,并从begin()迭代一半的大小 - 这将是中间。像这样:

for (it = bst.begin(), int middle = 0; middle < bst.size()/2; it++, middle++) {
    cout << (*it).first << " ";
}

// now after the loop it is the median.

如果您使用map对事物进行排序 - 那么这是一种矫枉过正的行为,恕我直言。你可以使用数组(或vector)更有效地做到这一点,然后找到中间部分也是微不足道的。 map用于按键访问数据,而不仅仅是排序。

答案 1 :(得分:5)

显示的代码是您滥用地图来对键进行排序。

您可以获得更多性能,避免完全排序和复制:

   const int len = 14;
   const int a[len] = {10,15,14,13,17,15,16,12,18,10,29,24,35,36};

   std::nth_element( a, a+len/2, a+len );
   std::cout << "Median: " << a[len/2] << std::endl;

如果您更喜欢使用STL容器,您的代码将如下所示(假设具有随机访问迭代器的容器):

   std::vector<int> v( a, a+len );
   std::nth_element( v.begin(), v.begin()+len/2,v.end() );
   std::cout << "Median: " << v[len/2] << std::endl;

答案 2 :(得分:2)

std::map可能不是查找中位数的最佳容器。但这很简单:

it = bst.begin();
advance( it, bst.size() / 2);
cout << endl << "median: " << it->first << endl;

答案 3 :(得分:0)

std :: maps不能一次性给你中位数。如果你想要中位数,你需要使用this algorithm