可以给map.end()赋值吗?

我想知道在地图中的最后一个元素之后分配值 1 是否是一种不好的做法,如下例所示。

using namespace std;

auto chances = map<int, int>{};
chances[0] = 20;
chances[1] = 10;
chances[2] = 30;
int last = 0;
for (auto it = chances.begin(); it != chances.end();) {
    last = it->second;
    (++it)->second += last;
}

此外,在 for 循环中检查变量比终止函数更快(循环的这一部分称为什么?)

回答

是的,分配给end()任何容器的迭代器是不好的做法(不仅仅是map

在所有标准 C++ 容器中,end()迭代器是不可解引用的。任何对end()迭代器取消引用(在本例中为赋值)的尝试都是未定义行为

在您的示例代码中,end()由于使用了预增量运算符,因此会取消引用此迭代器:

(++it)->second += last

it为1之前end()的迭代期间,这将增加it和取消引用的分配结果(结束)。


此外,在 for 循环中检查变量比终止函数更快

一般来说,最好先将终止条件分配给一个常量,然后与它进行比较。尽管编译器可以执行此转换,但有许多因素可能会导致每次迭代重复评估函数调用。

也就是说,为自己做基准测试,不要过早地优化。除非它们处于紧密循环中,否则像这样的小事情很少会产生很大的不同。

注意:请尽量在每个 SO 帖子中仅提出 1 个问题,以帮助提高可搜索性并防止它因过于宽泛而被关闭。


哦,是的,我是using namespace std;😉

您应该训练自己不要这样做,因为这是仅由于legacy才存在的不好的做法。另外,您未来的同事会感谢您。


以上是可以给map.end()赋值吗?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>