gpt4 book ai didi

c++ - 此迭代代码中发生了什么?

转载 作者:太空宇宙 更新时间:2023-11-04 16:17:29 24 4
gpt4 key购买 nike

我对下面代码中以下两个迭代器指向的内容感到很困惑。

list<fieldT>::iterator steeperField = currentField;
list<fieldT>::iterator shallowerField =
activeFields.insert(currentField, *currentField);

如果我们假设 activeFields(这些迭代器所属的列表)的索引为 0、1、2(count=3),并且 currentField 当前指向 1。那么我想:

  1. steeperField 设置为索引 1。
  2. 将 fieldT 插入列表中索引 1 处,并返回从索引 1 开始的迭代器。

因此,steeperField 应该指向与 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并推断出您问题中的问题:

Therefor, steeperField should be pointing to the same location as shallowField.

不,不应该。 steeperField 是向右移动了一个的旧元素; shallowField 是您的新元素。 迭代器不是容器中的固定索引;他们链接到元素。在链表中,这意味着当您在元素之前插入新元素时,它们跟随该元素。

This does not seem to be what's happening: shallowerField appears to point to index 2. Why?

事实并非如此。 shallowerField 指向索引 1,这是应该的。 steeperField 指向索引 2,它也应该如此。

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

关于c++ - 此迭代代码中发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21077124/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com