vector的end()返回的迭代器,为什么指向的是最后一个节点的下一个节点,而不是最后一个节点?
添加评论
按投票排序
按时间排序
4 个回答
其他答案回答得都差不多了,我来扯远一点吧:
在程序执行过程中有些条件是自始至终不变的,称为不变量(invariants, 不知道和 @冯东 说的invariable rules是不是一回事)。假设以起止指针的方式实现数组,止指针指向最后一个元素的下一个,则以下几条至始至终都正确:
1. 数组的终点指针减去起点指针之差,再除以单个元素的长度,等于数组元素的个数;
2. 空数组的起点指针等于终点指针;
3. 数组的空间占用等于终点指针减去起点指针;
...
如果换成终点指针指向最后一个元素,还有多少条件能始终保持不变?
1. 数组的终点指针减去起点指针之差,在除以单个元素的长度,再加1等于数组元素的个数。如果终点指针为NULL,则长度为0; // 变了
2. 空素组的终点指针指向NULL;
3. 数组的空间占用等于终点指针减去起点指针,再加上一个元素的长度,如果终点指针为NULL,则空间占用为0;// 变了
...
第二种实现就不知道什么是invariants。如果写成真实的代码除了性能差异外,第一种看起来会非常舒服,第二种能工作,但读起来就变成了一坨屎。我们平时遇到同样功能水平完全不同的“正确”的实现,差异也多半在这里。
vector 迭代器的原理,和数组的例子差不多。
在程序执行过程中有些条件是自始至终不变的,称为不变量(invariants, 不知道和 @冯东 说的invariable rules是不是一回事)。假设以起止指针的方式实现数组,止指针指向最后一个元素的下一个,则以下几条至始至终都正确:
1. 数组的终点指针减去起点指针之差,再除以单个元素的长度,等于数组元素的个数;
2. 空数组的起点指针等于终点指针;
3. 数组的空间占用等于终点指针减去起点指针;
...
如果换成终点指针指向最后一个元素,还有多少条件能始终保持不变?
1. 数组的终点指针减去起点指针之差,在除以单个元素的长度,再加1等于数组元素的个数。如果终点指针为NULL,则长度为0; // 变了
2. 空素组的终点指针指向NULL;
3. 数组的空间占用等于终点指针减去起点指针,再加上一个元素的长度,如果终点指针为NULL,则空间占用为0;// 变了
...
第二种实现就不知道什么是invariants。如果写成真实的代码除了性能差异外,第一种看起来会非常舒服,第二种能工作,但读起来就变成了一坨屎。我们平时遇到同样功能水平完全不同的“正确”的实现,差异也多半在这里。
vector 迭代器的原理,和数组的例子差不多。