相关疑难解决方法(0)

对于stl容器,end()是一个昂贵的操作

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容器上的大型循环添加了明显的运行时开销,或者编译器是否已经优化了这种情况.

编辑:许多非常好的评论指出:这个问题仅在循环内的代码不修改结束迭代器时才有效.否则,当然重复的结束呼叫是强制性的.

c++ performance containers stl

19
推荐指数
2
解决办法
1619
查看次数

C++对std :: set,std :: map等的常量时间开始/结束/ rbegin/rend执行吗?

对于std :: set和std :: map等数据类型,其中查询以对数时间发生,是否需要实现维护开始和结束迭代器?访问开始和结束是否意味着可能在对数时间内发生查找?

我一直认为开始和结束总是在恒定的时间内发生,但我在Josuttis找不到任何确认.现在我正在做一些我需要对表演进行肛门的事情,我想确保覆盖我的基础.

谢谢

c++ stl

5
推荐指数
3
解决办法
2280
查看次数

在不连续的容器中end()以什么方式指向'一个接一个'?

根据这个这个问题的答案,C++标准在第23.2.1节中规定end()了所有stl容器的时间复杂度.

如果我理解正确:

  1. std::forward_list 只知道它的第一个元素,每个列表条目只知道下一个元素.
  2. 列表在内存中是不连续的
  3. a.begin() == a.end() 适用于空容器 a
  4. end() 应该是一个指向'一个超过容器结尾的'的迭代器

因此,当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

c++ stl

3
推荐指数
3
解决办法
135
查看次数

标签 统计

c++ ×3

stl ×3

containers ×1

performance ×1