[英]how to find the middle element of the map?? STL
嗨,我陷入了 STL 库/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 << " ";
}
现在,当我打印此 map 时,它按排序顺序打印。 现在有没有最简单的方法来找到这个 map 的中间......需要找到更大问题的中位数......所以尝试实现平衡二叉搜索树..
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
用于按键访问数据,而不仅仅是排序。
使用显示的代码,您正在滥用 map 对密钥进行排序。
您可以获得更高的性能,避免完全排序和复制:
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;
std::map
可能不是定位中位数的最佳容器。 但这很简单:
it = bst.begin();
advance( it, bst.size() / 2);
cout << endl << "median: " << it->first << endl;
std::maps 不能一次性给你中位数。 如果你想要中位数,你需要使用这个算法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.