以下代码中的以下两个迭代器指向我,我感到非常困惑。

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。

总之,进行测量时出了点问题。

10-08 11:04