小编mrc*_*lng的帖子

在储备()中出现大幅高估是否有不利因素?

让我们假设我们有一个创建和使用可能非常大vector<foo>的方法.已知最大元素数量maxElems.

从我的最佳知识来看,C++ 11的标准实践是:

vector<foo> fooVec;
fooVec.reserve(maxElems);
//... fill fooVec using emplace_back() / push_back()
Run Code Online (Sandbox Code Playgroud)

但是,如果我们有一个场景,在我们的方法的大多数调用中元素的数量将显着减少,会发生什么?

保守的reserve呼叫是否有任何缺点,除了超额分配的内存(shrink_to_fit()必要时可以释放)?

c++ performance c++11

9
推荐指数
1
解决办法
418
查看次数

术语:“CL”与“MSVC 编译器”相同吗

我很难弄清楚命令行工具是否cl.exe就是人们在谈论“MSVC 编译器”时所指的那个工具。

两者是同一件事还是使用 cl 来控制编译器?

visual-c++ cl

6
推荐指数
0
解决办法
1171
查看次数

在不连续的容器中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++ ×2

c++11 ×1

cl ×1

performance ×1

stl ×1

visual-c++ ×1