如何在std :: map上迭代,根据键值返回已排序的元素

时间:2016-01-07 12:04:22

标签: c++ sorting iteration stdmap

容器std :: map是STL提供的数据结构。在几乎所有编译器中,它都被实现为R& B树,保证了log(n)插入,查找和删除时间。

在红色和黑色树中,元素基于存储元素的“less”运算符进行排序。所以基本上如果一个根是N + 1,N将在左子树上,而N + 2将在右子树上,这个顺序将由less运算符决定。

我的问题是在执行以下代码时:

  std::map<char,int> testMap;

  testMap['a']=10;
  testMap['b']=30;
  testMap['g']=50;
  testMap['d']=70;
  testMap['h']=23;
  testMap['f']=44;
  testMap['c']=100;
  testMap['e']=10;

  typedef std::map<char, int>::iterator it_type;
  for(it_type iterator = testMap.begin(); iterator != testMap.end(); iterator++) {
      std::cout << iterator->first << std::endl;
  }

这是代码的输出: 一个 b C d Ë F G ħ

根据键值以排序顺序返回元素。考虑到底层数据结构是红色和黑色树这一事实,这怎么可能呢? c ++如何从最左边的子树迭代到最右边的子树,它是一个双重链接的r&amp; b树?

1 个答案:

答案 0 :(得分:2)

从广义上讲,有两种方法可以迭代树的内容:广度优先,深度优先。广度首先在一个级别上查看所有元素,然后再进入下一级别。深度首先从树的一个分支下移到它的叶子,然后上升并返回到下一个叶子等。对于表示已排序数据的树,深度优先可以给你排序顺序的数据,以及 var annotation = new Konva.Line({ points: this.contour, stroke: color, closed: true, strokeWidth: 1 }); var nativeImageObject = new Image(); nativeImageObject.onload = function() { var konvaImage = new Konva.Image({ image: nativeImageObject }); annotation.fillPatternImage(konvaImage); DentalChart.Pattern.customPatternImages.push(customPatternImage); gridLayer.add(annotation); stage.draw(); }; nativeImageObject.src = pattern.toDataURL(); nativeImageObject.id = patternEnum + '' + color; 迭代器的作用,因为它最有用。