让我们假设我们有一个创建和使用可能非常大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()
必要时可以释放)?
我很难弄清楚命令行工具是否cl.exe
就是人们在谈论“MSVC 编译器”时所指的那个工具。
两者是同一件事还是使用 cl 来控制编译器?
根据这个和这个问题的答案,C++标准在第23.2.1节中规定end()
了所有stl容器的时间复杂度.
如果我理解正确:
std::forward_list
只知道它的第一个元素,每个列表条目只知道下一个元素.a.begin() == a.end()
适用于空容器 a
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
?