STL迭代器与容器类一起使用,在概念上类似于指向容器中存储的特定元素的指针。
以下陈述之一是真实的。哪一个?
it
超出程序范围时,it
会被破坏,会自动调用delete it
;。显然解决方案是3.但我不明白为什么。有人可以详细说明为什么会这样,并可能说明为什么其他人也是假的?
答案 0 :(得分:3)
考虑链表(list
)中项目地址的要求。它们不需要在内存中顺序。
delete
是在指针上手动完成的,它不会自动发生(即使指针超出范围)(除非在某些API中完成)。迭代器是(通常)类,因此delete
甚至不适用。但迭代器会被破坏。
您也可以将指针分类为迭代器。但delete
仍然不会自动调用。
请注意this only applies to random access iterators。您可以按如下方式计算容器中的项目数:
int count = 0;
for (iterator it = begin(); it != end(); ++it, ++count) { }
所以你增加begin()
count
次来到end()
,
所以begin() + count = end()
,
所以end() - begin() = count
和count = size()
,
所以end() - begin() = size()
这不是C ++的工作方式。尽管存在设计模式来实现此行为,但通常在修改类时,您有责任确保在失效时更新任何相关类。当您尝试使用超出范围的容器的迭代器时,这将导致未定义的行为。
end()
已经过了最后一个元素,可能会考虑到这样的事情:(我确信还有其他原因)
for (iterator it = begin(); it != end(); ++it)