以下代码中的以下两个迭代器指向我,我感到非常困惑。
list<fieldT>::iterator steeperField = currentField;
list<fieldT>::iterator shallowerField =
activeFields.insert(currentField, *currentField);
如果我们假设activeFields(这些迭代器所属的列表)的索引为0,1,2(计数= 3),并且currentField当前指向1,那么我可以想象:
陡峭的字段设置为索引1。
将fieldT插入到索引1的列表中,并返回从索引1开始的迭代器。
因此,teeperField应该指向与shallowField相同的位置。这似乎并非正在发生的事情:shallowerField似乎指向索引2。为什么?
activeFields
是作为list<fieldT> & activeFields
传递的参数。 currentField
是作为list<fieldT>::iterator & currentField
传递的参数。 currentField
最初是通过调用currentField = activeFields.begin();
来启动的。 最佳答案
当我简化程序时,I get the results I expect(没有断言失败):
#include <list>
#include <iostream>
#include <cassert>
using std::list;
std::ostream& operator<<(std::ostream& os, const list<char>& l)
{
os << '{';
for (auto el : l)
os << el << ',';
os << '}';
return os;
}
int main()
{
list<char> l{'a', 'b', 'c'};
list<char>::iterator insertAt { std::next(std::begin(l)) }; // 'b'
std::cout << l << '\n';
list<char>::iterator newEl { l.insert(insertAt, 'd') };
std::cout << l << '\n';
assert(std::distance(std::begin(l), insertAt) == 2);
assert(std::distance(std::begin(l), newEl) == 1);
}
这使我相信我在您的问题中遗漏了一些内容,因此我将其表达为as in this post并推论出您的问题中的问题:
因此,teeperField应该指向与shallowField相同的位置。
不,不应该。
steeperField
是已被右移的旧元素; shallowField
是您的新元素。迭代器不是容器中的固定索引;它们链接到元素。在链接列表中,这意味着当您在元素之前插入新元素时,它们将跟随该元素。这似乎并非正在发生的事情:shallowerField似乎指向索引2。为什么?
它不是。
shallowerField
正确地指向索引1。 steeperField
也会同样指向索引2。总之,进行测量时出了点问题。