容器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树?
答案 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;
迭代器的作用,因为它最有用。