begin() 是一个有效的迭代器操作,如果是,它指的是啥?

Posted

技术标签:

【中文标题】begin() 是一个有效的迭代器操作,如果是,它指的是啥?【英文标题】:Is begin() a valid iterator operation, and if so, what does it refer to?begin() 是一个有效的迭代器操作,如果是,它指的是什么? 【发布时间】:2020-04-20 03:07:13 【问题描述】:

迭代器是否将 begin() 和 end() 定义为成员函数?我认为容器已经定义了 begin() 和 end(),而迭代器的可用操作数量有限,例如比较、递增和取消引用。在下面的代码示例中,他似乎在迭代器上使用了 begin() 和 end(),我不确定这将如何工作。这是一个错误,还是我错过了什么?

下图来自 Bjarne Stroustrup 的《编程:原理与实践》,第 20 章的第 737 和 738 页。唯一重要的部分是 Text_iterator 类中 ln 和 pos 的定义,以及 (*ln) 的用法。结尾()。我用 2 标记了 (*ln).end()。对于上下文,他正在为类 Document 定义一个迭代器,这是一个文本文件的内存表示。

谢谢。

一个相关的问题,有人知道如何联系 Bjarne 吗?我想问他这个问题,但我不知道他的电子邮件。从他的常见问题解答中,他似乎欢迎电子邮件,但没有在任何地方说。

【问题讨论】:

注意(*ln).end() 中的*。他没有在迭代器中使用begin,而是在取消引用迭代器并在Line 中使用begin 方法@ 987654328@ 引用.我会把它写成ln->end(),但 Stroustrup 博士可能有理由在这里使用更笨重的语法。 【参考方案1】:

没有。典型的迭代器没有beginend 方法。 beginend 没有在迭代器上被调用,它们在迭代器引用的对象上被调用。 *ln 取消引用迭代器并提供迭代器引用的对象,在本例中为 Line(*ln).end() 的意思是“在ln 处为我获取Line 对象并在其上调用end 方法。”无论Line 必须有beginend 方法,否则编译器会捕获错误。

遍历逻辑,我们得到

++pos; // advance iterator one character in the current Line
if (pos==(*ln).end())  // if this character is the the `Line`'s end iterator
                        // we need a new line

    ++ln; // advance to the next line
    pos = (*ln).begin(); // referenced character is first character in next line

return *this; 

这允许用户逐个字符地遍历文档,而不会意识到他们实际上是在遍历行,从而允许编写者使用他们已经拥有的代码来遍历文档中的行和行中的字符。几乎没有为原本可能很复杂的任务编写新代码。

【讨论】:

以上是关于begin() 是一个有效的迭代器操作,如果是,它指的是啥?的主要内容,如果未能解决你的问题,请参考以下文章

迭代器知识整理

3.4 迭代器

C++ STL map迭代器

迭代器 begin() 应该包含 3,输出是 2? [关闭]

课时10:迭代器迭代器失效分析

获得std :: set中间(中位数)的有效方法?