在https://doc-snapshots.qt.io/qtcreator-extending/coding-style.html上,建议编写如下循环:
Container::iterator end = large.end();
for (Container::iterator it = large.begin(); it != end; ++it) {
//...;
}
Run Code Online (Sandbox Code Playgroud)
代替
for (Container::iterator it = large.begin(); it != large.end(); ++it) {
//...;
}
Run Code Online (Sandbox Code Playgroud)
由于我很少在任何代码中看到这种风格,我想知道end()的连续调用是否真的为stl容器上的大型循环添加了明显的运行时开销,或者编译器是否已经优化了这种情况.
编辑:许多非常好的评论指出:这个问题仅在循环内的代码不修改结束迭代器时才有效.否则,当然重复的结束呼叫是强制性的.
对于std :: set和std :: map等数据类型,其中查询以对数时间发生,是否需要实现维护开始和结束迭代器?访问开始和结束是否意味着可能在对数时间内发生查找?
我一直认为开始和结束总是在恒定的时间内发生,但我在Josuttis找不到任何确认.现在我正在做一些我需要对表演进行肛门的事情,我想确保覆盖我的基础.
谢谢
根据这个和这个问题的答案,C++标准在第23.2.1节中规定end()了所有stl容器的时间复杂度.
如果我理解正确:
std::forward_list 只知道它的第一个元素,每个列表条目只知道下一个元素.a.begin() == a.end() 适用于空容器 aend() 应该是一个指向'一个超过容器结尾的'的迭代器因此,当forward_list我在s 上进行一些循环时,我想知道:
在forward_list的情况下,end()如何具有恒定的时间复杂度(即不会提前到'结束一个')?
我看了看forward_list.cpp并发现了声明
iterator end() _NOEXCEPT
{return iterator(nullptr);}
Run Code Online (Sandbox Code Playgroud)
这对于恒定时间要求是有意义的,但不适用于与上述第4点相对应的 - 公认的规则 - 规则.
所以仍有一些问题:
nullptr符合"一个接一个"的定义?MyForwardList.begin() == MyForwardList.end()真,如果MyForwardList是空的?end()总是被定义为nullptr?