【发布时间】:2020-08-16 12:16:19
【问题描述】:
我正在努力实施我自己的清单。我看到 std::list::end() 将迭代器返回到列表容器中最后一个元素的位置。由于列表元素存储在不连续的内存位置,我想知道如何估计这个过去元素的位置。
std::list<int> ls;
ls.push_back(1);
ls.push_back(2);
std::list<int>::iterator it = ls.end();
std::cout << &(*it) << std::endl << &(*++it) << std::endl << &(*++it) << std::endl;
正如上面的代码所示,我什至可以递增迭代器以指向下一个元素。如何知道下一个元素将存储在哪个位置(在内存中)?
【问题讨论】:
-
你没有。对于列表迭代器,结束迭代器 always 指向列表末尾之后的位置。向列表末尾添加更多值,完全相同的迭代器仍然指向列表末尾之后的一个。
std::list的“列表末尾之后的一位”迭代器永远指向列表末尾之后的一位,并且将永远继续这样做,无论列表是空的,还是吃掉你所有的内存。跨度> -
这不是我的问题。问题是列表如何知道在将下一个元素添加到列表之前将其存储在内存中的哪个位置?
-
我回答了。它没有。如果您使用结束迭代器向列表添加新值,它将转到分配给它的任何内存。并且列表迭代器仍将指向列表末尾的“过去”。提示:“列表末尾的一个”不是,我重复一遍,不 表示特定的内存位置。这是一个“概念价值”。一些神奇而神秘的值,总是被列表方法解释为列表中最后一个值之后的意思。
-
代码只显示未定义行为之神在嘲笑你。取消引用或递增
end()迭代器是UB,您的程序无效。 -
关于你自己的实现,我可以看到两种可能性(可能还有更多):你可以让
end()成为nullptr,然后按照next指针,你最终会到达@987654327 @你知道它已经停止了。或者你可以有一个表示“结束”的哨兵对象,你可以识别它(也许它可以有next指向this或者你可以只将指向哨兵的指针存储在列表对象或迭代器本身中)。
标签: c++