1. 关于 return
和 std::exit()
从
main
函数以return
语句或以抵达函数尾返回,会进行正常函数终止(调用拥有自动存储期的对象的析构函数),再执行std::exit
,将return
语句的参数(或如果使用隐式return
就是0
)作为exit_code
传递。
也就是说 return
语句相比 std::exit
函数多执行了一步 调用拥有自动存储期的对象的析构函数
。在使用了大量 STL 容器的代码中,正是多执行的这一步可能会造成 TLE,形成输出了结果但是超时的情况。
2. 关于 std::list
和 std::vector
在图的存储方面表现
经过实际测试,可以发现在图的存储方面 std::vector
要优于 std::list
,无论是否调用析构函数。原因猜测为在边的数量众多的情况下使用 std::list
会造成大量内存碎片,导致运行缓慢。
附:vector + 析构函数,list + 析构函数,vector - 析构函数,list - 析构函数
3. 关于 std::deque
和 std::vector
的最小内存开销
std::deque
的存储按需自动扩展及收缩。扩张std::deque
比扩张std::vector
更优,因为它不涉及到复制既存元素到新内存位置。另一方面,std::deque
典型地拥有较大的最小内存开销;只保有一个元素的std::deque
必须分配它的整个内部数组(例如 64 位libstdc++
上是对象尺寸的 8 倍;64 位libc++
上是对象尺寸的 16 倍和 4096 字节中的较大者)。
也就是说在需要动态的存储多种元素但每种元素数量相对较少的时候,使用 std::vector
比 std::deque
在空间上更优。