STL iota包含文件更改

时间:2017-03-22 18:21:48

标签: c++ c++11 stl c-preprocessor iota

iota函数以前位于<algorithm>标题中。它已改为<numeric>

我需要保持旧的方式以实现向后兼容性,因此我想使用预处理器选项来选择要包含的正确标头。

这是什么时候改变了,我应​​该使用哪个预处理器选项?

3 个答案:

答案 0 :(得分:4)

iota永远不会被移动&#34;来自<algorithm>。 C ++ 03在任何头文件中都没有std::iota,并且没有符合要求的实现可以提供它,因为iota不是保留名称,这需要工作:

#define iota arbitrary preprocessing token sequence like this and *that and "!" and \
             -13833rfa231fn7or.other.line.noise.that.happens.to.be.a.pp.number
#include <every-standard-header-here>

它已添加到C ++ 11中的<numeric>,并作为扩展程序位于the SGI STL <numeric>中。它从未进入过<algorithm>,因此无法从中移除。

现在,由于允许标准库标题以任意方式相互包含,因此C ++ 11模式中的GCC&lt; = 5&#39; <algorithm>包含<random>偶然事件,其中包括<numeric>偶然事件。这仅仅是您不应该依赖的实施细节,GCC 6不再这样做。解决这个问题的方法是简单地包含正确的标题,这个标题一直是<numeric>

答案 1 :(得分:1)

正如iota所见,<(来自希腊语ι)在<numeric>到达#if __cplusplus <= 199711L #include <algorithm> #else #include <numeric> #endif 后被重新引入。因此,检查您是否在没有它的环境中,并包括旧标头,否则,请包含新标头。

这样的事情可能会起到作用:

__cplusplus

ref201103L的值设置为__cplusplus。声称完全符合2011年标准;它没有告诉你部分一致性或编译器扩展。如果std::iota设置为201103L,则编译器完全符合或对您说谎。如果不是,那么你无法确定它支持哪些功能。

详细了解

此外,这个Quora answer也同意$ pip install -U memory_profiler 发生mprof run --help Usage: mprof run [options] Options: --version show program's version number and exit -h, --help show this help message and exit --python Activates extra features when the profiling executable is a Python program (currently: function timestamping.) --nopython Disables extra features when the profiled executable is a Python program (currently: function timestamping.) -T INTERVAL, --interval=INTERVAL Sampling period (in seconds), defaults to 0.1 -C, --include-children Monitors forked processes as well (sum up all process memory) -M, --multiprocess Monitors forked processes creating individual plots for each child 的变化(或诚实;重新介绍)。

如果你负担得起,只需要包括两个库。

答案 2 :(得分:1)

您要做的是检查__cplusplus变量是否低于某一点,如果不是#include <algorithm>,则#include <numeric>

#if __cplusplus <= 199711L
  #include <algorithm>
#else
  #include <numeric>
#endif

这应该适用于您需要执行此操作的任何库,只需注意您可能必须将199711L更改为适当的数字。