C ++迭代器取消引用和前缀递增/递减样式? *--Iter ok 风格是不是明智?

Posted

技术标签:

【中文标题】C ++迭代器取消引用和前缀递增/递减样式? *--Iter ok 风格是不是明智?【英文标题】:C++ Iterator dereference and prefix increment/decrement style? Is *--Iter ok style wise?C ++迭代器取消引用和前缀递增/递减样式? *--Iter ok 风格是否明智? 【发布时间】:2011-05-17 00:41:23 【问题描述】:

在使用 C++ 迭代器进行编码时,如果你想获得迭代器指向的前一个值,你会写:

*--Iter

或者您认为像这样添加括号会更好:

*(--Iter)

?

【问题讨论】:

为了只得到之前的值,我个人更喜欢无损的*(Iter-1) Vlad - 在我的特殊情况下,我没有想到这个选项,因为在递减和取消引用之后不再使用迭代器。鉴于这种情况 - 您是否仍然更喜欢您的建议而不是原始问题中的两个? @Czarak:是的。这将表明获取先前值的明确意图,而不是更改迭代器的位置。更改迭代器的位置会向读者暗示稍后将使用新值。 @Vlad:这仅适用于随机访问迭代器,尽管您可以使用 C++0x / Boost 中的 prev() 函数。 @UncleBens:是的。至少,vector 的迭代器有这个功能。这不会与 map 一起编译(至少在 MSVC 的 STL 实现中)。 【参考方案1】:

就程序正确性而言,这并不重要。但我总是将其表达为*(--Iter),因为这比*--Iter更具自我记录性,更易于人类理解。

【讨论】:

额外的两个字符虽然是多余的,但确实使它更容易理解,尤其是对于那些完全不了解优先规则的人。 如果一个操作数被两个不同的运算符包围,那么运算符的优先级就很重要。此处并非如此,因此在此示例中运算符优先级根本不重要。即使* 的优先级高于--(我不知道是不是这种情况),-- 仍然绑定到Iter,因为没有争用。 Iter 不是 * 的操作数。如果是关于运算符优先级,您将如何解决? (*--)Iter?没有解决办法,因为没有问题。 Iter 只固定了一个运算符,而不是两个。 事实上,如果你look it up、*和前缀--具有完全相同运算符优先级。 (如果您不信任 Wikipedia,TC++PL 第 120 页也同意。)同样,这并不重要,但“-- 的优先级高于取消引用”这一说法是错误 @Fred:所有这些都与我的观点完全无关。但如果它让你感觉更好,我会编辑我的帖子。 @Czarak:我更喜欢*--Iter,因为添加的括号不可能改变意思,所以它们只是视觉上的混乱。【参考方案2】:

为了清楚起见,我会使用后者,但两者都是完全有效且等效的。

注意:如果有任何混淆,该语法不只是获取前一个迭代器的值,它还会将迭代器本身向后移动。如果您想在不修改现有迭代器的情况下获取前代迭代器的值,那么您需要一个临时的。

【讨论】:

不,取消引用后不需要迭代器。 Peter - Vlad 在对上述问题的评论中提出了很好的建议,即在不修改我拥有的迭代器且不使用临时迭代器的情况下获取前身迭代器的值。【参考方案3】:

即使您让其中一个按预期工作,它们也很难阅读。这必须在一个语句中完成吗?

【讨论】:

不,它不一定是一个单一的声明。如果我让其中一个按预期工作,你是什么意思?他们都做我所期望的,他们都做同样的事情? 我不同意这两种方法都很难阅读。专业程序员不会因此而受挫,尽管新手可能会。 @John 这对我来说是“聪明”的恶臭。我尽量让我的 C++ 代码看起来像 Perl。【参考方案4】:

两者都可以。使用您需要遵守的任何编码标准所偏好的一种,或者您个人更喜欢的一种。

【讨论】:

运算符优先级在这里不起作用,请参阅我对约翰回答的评论。

以上是关于C ++迭代器取消引用和前缀递增/递减样式? *--Iter ok 风格是不是明智?的主要内容,如果未能解决你的问题,请参考以下文章

取消引用集合迭代器时将“字符串&”绑定到“常量字符串”时出错

由引用传递的迭代器集/映射迭代器不可取消引用

向量迭代器不可取消引用 C++

输入迭代器是不是只能在赋值的右手符号上被取消引用?

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

并发 STL it++ 和 *it 安全吗?