C++ 这个迭代器代码中发生了什么?

C++ 这个迭代器代码中发生了什么?,c++,iterator,C++,Iterator,以下两个迭代器在下面的代码中指向什么,我感到非常困惑 list<fieldT>::iterator steeperField = currentField; list<fieldT>::iterator shallowerField = activeFields.insert(currentField, *currentField); list::迭代器陡峭字段=currentField; 列表::迭代器字段= 插入(currentField,*currentF

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

list<fieldT>::iterator steeperField = currentField;
list<fieldT>::iterator shallowerField = 
   activeFields.insert(currentField, *currentField);
list::迭代器陡峭字段=currentField;
列表::迭代器字段=
插入(currentField,*currentField);
如果我们假设activeFields(这些迭代器所属的列表)具有索引0,1,2(count=3),并且currentField当前指向1。然后我想:

  • 陡坡场设置为索引1
  • 一个fieldT被插入到索引1处的列表中,并返回一个从索引1开始的迭代器

  • 因此,陡坡场应指向与浅层场相同的位置。事实似乎并非如此:shallowerField似乎指向索引2。为什么?

    activeFields
    是作为
    list&activeFields
    传递的参数
    currentField
    是作为
    list::iterator¤tField
    传递的参数
    currentField
    最初是通过调用
    currentField=activeFields.begin()启动的

    首先让我们讨论函数声明

    iterator insert(const_iterator position, const T& x);
    
    它在迭代器位置之前插入元素x,并返回引用插入元素的迭代器

    在您的示例currentField中;是引用列表中某个元素的迭代器*currentField是元素的值。现在

    activeFields.insert(currentField, *currentField)
    
    插入与currentField引用的元素值相同的值;在这个元素之前。事实上,它将值传播到相对于currentField;的左侧

    如果我们假设currentField对应于列表{0,1,2}中的索引1,那么在操作之后,列表将看起来是{0,1,1,2},迭代器shallerField将引用它将对应于索引1的第一个1

    至于你的声明

    事实似乎并非如此:shallowerField似乎 指向索引2。为什么?

    那么正确的答案是“似乎”,也就是说,只有你觉得是这样。您应该展示一个简单的编译示例来演示这种情况

    这里有一个例子

    std::list<int> l = { 0, 1, 2 };
    
    std::list<int>::const_iterator position = std::next( l.cbegin() );
    
    std::cout << std::distance( l.cbegin(), position ) << std::endl;
    
    std::list<int>::iterator result = l.insert( position, *position );
    
    std::cout << std::distance( l.begin(), result ) << std::endl;
    

    首先,让我们讨论函数声明

    iterator insert(const_iterator position, const T& x);
    
    它在迭代器位置之前插入元素x,并返回引用插入元素的迭代器

    在您的示例currentField中;是引用列表中某个元素的迭代器*currentField是元素的值。现在

    activeFields.insert(currentField, *currentField)
    
    插入与currentField引用的元素值相同的值;在这个元素之前。事实上,它将值传播到相对于currentField;的左侧

    如果我们假设currentField对应于列表{0,1,2}中的索引1,那么在操作之后,列表将看起来是{0,1,1,2},迭代器shallerField将引用它将对应于索引1的第一个1

    至于你的声明

    事实似乎并非如此:shallowerField似乎 指向索引2。为什么?

    那么正确的答案是“似乎”,也就是说,只有你觉得是这样。您应该展示一个简单的编译示例来演示这种情况

    这里有一个例子

    std::list<int> l = { 0, 1, 2 };
    
    std::list<int>::const_iterator position = std::next( l.cbegin() );
    
    std::cout << std::distance( l.cbegin(), position ) << std::endl;
    
    std::list<int>::iterator result = l.insert( position, *position );
    
    std::cout << std::distance( l.begin(), result ) << std::endl;
    

    当我简化程序时,(无断言失败):

    #包括
    #包括
    #包括
    使用std::list;
    
    std::ostream&operator当我简化程序时,(无断言失败):

    #包括
    #包括
    #包括
    使用std::list;
    

    std::ostream&operator请提供更多上下文。什么是
    StiperField
    currentField
    shallowerField
    ?是的,我不太明白:你有没有追踪到你为使它指向索引2而做的代码?“shallowerField似乎指向索引2”-说明你是如何得出这个推论的,因为之前的前提是错误的<代码>陡坡场
    在此插入过程中保持不变且不会失效。它仍然引用它以前使用的相同元素,但现在您将一个元素推到它前面。如果它最初引用的是1插槽,它(
    stoperfield
    )现在将引用2插槽。听起来你是在用
    StiperField
    而不是
    shallowerField
    进行测量,没有显示你真正在做什么的代码,这纯粹是推测,所以vtc除非你提供详细信息。我想我明白了OP的作用:假设列表迭代器指向元素序列中的位置,而不是元素本身。请提供更多上下文。什么是
    StiperField
    currentField
    shallowerField
    ?是的,我不太明白:你有没有追踪到你为使它指向索引2而做的代码?“shallowerField似乎指向索引2”-说明你是如何得出这个推论的,因为之前的前提是错误的<代码>陡坡场
    在此插入过程中保持不变且不会失效。它仍然引用它以前使用的相同元素,但现在您将一个元素推到它前面。如果它最初引用的是1插槽,它(
    stoperfield
    )现在将引用2插槽。听起来你是在用
    StiperField
    而不是
    shallowerField
    进行测量,没有显示你真正在做什么的代码,这纯粹是推测,所以vtc除非你提供详细信息。我想我明白了OP的作用:假设列表迭代器指向元素序列中的位置,而不是元素本身。对,新元素应该在位置1。为什么它位于位置2?
    迭代器shallerField将引用第一个1,它将对应于索引1。
    阅读问题。OP说了所有这些。问题是[表面上]它不是@轨道上的亮度竞赛我已经在我的帖子上注明了日期,现在这篇帖子反映了你的评论。是的,现在看起来-问题似乎是OP测量不正确。@轨道上的亮度竞赛我又做了一次更改。对,所以新元素应该在位置1。为什么它位于位置2?
    迭代器