内存中设置的 STD
STD set in memory
根据我的阅读,该集合是使用树实现的(我希望是二叉搜索树)。据我所知,树的元素不是以连续的方式存储的,因为它们是使用 [= 创建的15=]新。
这就是迭代一组的方法。
for (auto it = myset.begin() ; it != myset.end() ; it++)
//or
for (auto it : myset)
在第一种方法中,如果树中的元素不是以连续的方式存储,“it++”将如何工作?
for 循环与容器没有直接关系,它只是允许您在满足条件时多次执行某个代码块。
For循环的常见应用是按顺序调整一些数字,并使用它以该数字为索引(从开头偏移)来访问连续数组中的某些元素。
正如您所提到的,它不适用于未连续对齐的数据,但“For”循环不仅限于更新索引。 Iterator是object的一种模式,封装了容器遍历的逻辑。容器提供迭代器获取的方法,然后迭代器提供方法在某个方向移动容器内容。
这样您就可以使用带有迭代器的“for”循环(它不仅限于更新索引!)来遍历集合元素
for (auto iterator = my_set.begin(); iterator != my_set.end(); iterator++)
// do something with element through iterator
C++11“range-based for”功能只允许您为相同的逻辑提供紧凑的形式:
for (auto iterator : my_set)
// do something with element through iterator
内部设置的前向迭代器只是按照特定的顺序遍历树节点,处理下一个节点选择的所有逻辑,在二叉搜索树中从左到右移动。
你可以想象 set::begin() returns 一个内部存储集合中第一个节点地址的迭代器(前向迭代器的最左边的叶子)。 Iterator::operator++ 以更新迭代器以按排序顺序引用下一个节点的方式实现。
从迭代器的角度来看下一项选择的非正式逻辑:
如果我的节点已经离开 child - 它小于我的元素,所以我不需要访问它。右节点比我的元素大,所以它是下一个元素。
如果我的节点没有权限 child - 我需要向上移动以找到下一个元素。我需要知道我是从左方向还是右方向上升。如果我从左子树向上移动 - 那么 parent 节点的值是下一个有序值。如果我从右子树移动 - 我已经访问了这个节点,我需要递归地继续我的提升,同时我会发现我从左子树接近节点。如果没有找到这样的节点 - 这意味着我刚刚指向最后一个元素,所以现在我应该使内部引用无效以突出显示迭代器到达容器的末尾。
根据我的阅读,该集合是使用树实现的(我希望是二叉搜索树)。据我所知,树的元素不是以连续的方式存储的,因为它们是使用 [= 创建的15=]新。 这就是迭代一组的方法。
for (auto it = myset.begin() ; it != myset.end() ; it++)
//or
for (auto it : myset)
在第一种方法中,如果树中的元素不是以连续的方式存储,“it++”将如何工作?
for 循环与容器没有直接关系,它只是允许您在满足条件时多次执行某个代码块。
For循环的常见应用是按顺序调整一些数字,并使用它以该数字为索引(从开头偏移)来访问连续数组中的某些元素。
正如您所提到的,它不适用于未连续对齐的数据,但“For”循环不仅限于更新索引。 Iterator是object的一种模式,封装了容器遍历的逻辑。容器提供迭代器获取的方法,然后迭代器提供方法在某个方向移动容器内容。
这样您就可以使用带有迭代器的“for”循环(它不仅限于更新索引!)来遍历集合元素
for (auto iterator = my_set.begin(); iterator != my_set.end(); iterator++)
// do something with element through iterator
C++11“range-based for”功能只允许您为相同的逻辑提供紧凑的形式:
for (auto iterator : my_set)
// do something with element through iterator
内部设置的前向迭代器只是按照特定的顺序遍历树节点,处理下一个节点选择的所有逻辑,在二叉搜索树中从左到右移动。
你可以想象 set::begin() returns 一个内部存储集合中第一个节点地址的迭代器(前向迭代器的最左边的叶子)。 Iterator::operator++ 以更新迭代器以按排序顺序引用下一个节点的方式实现。
从迭代器的角度来看下一项选择的非正式逻辑: 如果我的节点已经离开 child - 它小于我的元素,所以我不需要访问它。右节点比我的元素大,所以它是下一个元素。 如果我的节点没有权限 child - 我需要向上移动以找到下一个元素。我需要知道我是从左方向还是右方向上升。如果我从左子树向上移动 - 那么 parent 节点的值是下一个有序值。如果我从右子树移动 - 我已经访问了这个节点,我需要递归地继续我的提升,同时我会发现我从左子树接近节点。如果没有找到这样的节点 - 这意味着我刚刚指向最后一个元素,所以现在我应该使内部引用无效以突出显示迭代器到达容器的末尾。