C++ STL:从A到B的一组自然数

C++ STL:从A到B的一组自然数,c++,stl,performance,C++,Stl,Performance,我想把A到B的自然数加在一起。目前我正在插入从A到B的每个数字,一个接一个地插入到集合中,就像这样 set<int> s; for(int j=A; j<=B; j++) s.insert(j); set; 对于(int j=A;j分配内存来保存n个数字总是至少在O(n)之内,所以我认为你不走运。分配内存来保存n个数字总是至少在O(n)之内,所以我认为你不走运。不。用顺序值填充容器所需的最短时间是O(n)时间。否。用顺序值填充容器所需的最短时间是O(n)时间。技术上我

我想把A到B的自然数加在一起。目前我正在插入从A到B的每个数字,一个接一个地插入到集合中,就像这样

set<int> s;
for(int j=A; j<=B; j++)
    s.insert(j);
set;

对于(int j=A;j分配内存来保存n个数字总是至少在O(n)之内,所以我认为你不走运。

分配内存来保存n个数字总是至少在O(n)之内,所以我认为你不走运。

不。用顺序值填充容器所需的最短时间是
O(n)
时间。

否。用顺序值填充容器所需的最短时间是
O(n)
时间。

技术上我认为这是
O(n log n)
,因为
set.insert
函数是
log n
O(n)
是你能做的最好的了,我想,但是要做到这一点,你需要使用一个未排序的容器,比如
向量
列表
从技术上讲,我认为这是
O(n log n)
,因为
set.insert
函数是
log n
O(n)
是您所能做的最好的方法,我认为,但为此,您需要使用未排序的容器,如
向量
列表

O(1)
仅适用于默认构造函数。
O(n)
用于使用迭代器的复制构造函数和排序序列插入。
O(log n!)
用于使用迭代器插入未排序的序列。

O(1)
仅适用于默认构造函数。
O(n)
用于使用迭代器的复制构造函数和排序序列插入。

O(log n!)
用于使用迭代器进行未排序的序列插入。

使用STL集合容器,您将永远无法获得O(1)时间。您可以通过使用
集合(输入迭代器f、输入迭代器l、常量键\u compare&comp)来减少运行时间
constructor并传入一个在给定整数范围内迭代的自定义迭代器。这可能运行得更快(取决于stl实现、编译器等)的原因是,您正在减少调用堆栈深度。在代码段中,您可以从.insert()一直向下调用每个整数的实际插入并返回。使用替代构造函数,增量操作向下移动到执行插入的帧中。如果编译器无法内联,则增量操作现在可能会有函数调用的开销。在采用此方法之前,应对此进行基准测试但是,如果stl实现具有.insert()的浅层调用堆栈,则速度可能会较慢


一般来说,如果您需要一组连续的整数,那么通过实现一个专门的集合类,您可以看到巨大的性能提升,该集合类只能存储和比较每个集合的上限和下限。

使用STL集合容器,您将永远得不到O(1)时间。您可以通过使用
集合(InputIterator f、InputIterator l、const key\u compare&comp)
构造函数并传入在给定整数范围内迭代的自定义迭代器来减少运行时间。这可能会运行得更快(取决于stl实现、编译器等)您正在减少调用堆栈深度。在代码段中,您从.insert()开始一直向下调用每个整数的实际插入并返回。使用替代构造函数,增量操作向下移动到执行插入的帧中。如果编译器无法内联,则增量操作现在可能会有函数调用的开销。在采用此方法之前,应对此进行基准测试但是,如果stl实现具有.insert()的浅层调用堆栈,则速度可能会较慢


一般来说,如果你需要一组连续的整数,你可以通过实现一个专门的集合类,只存储和比较每个集合的上限和下限,从而获得巨大的性能提升。

如果你想完全开箱即用,你可以设计一个“延迟加载”数组,用于此任务。基本上,在访问时,如果之前未设置该值,它将确定正确的值


这将允许设置为O(1)(假设“not Previous set”(未预先设置)标志本身为O(1)),但不会加快整个操作——它只会将该时间分散到运行的其余部分(整体可能需要更长的时间)。

如果您想要满足于开箱即用,您可以设计一个“延迟加载”数组,用于此任务。基本上,在访问时,如果之前未设置该值,它将确定正确的值


这将允许设置为O(1)(假设InInitialize“not Previous set”标志本身为O(1)),但不会加快整个操作——它只会将时间分散到运行的其余部分(可能需要更长的时间)。

STL不是魔术。如果在一个集合中需要k个数字,则需要O(k)如果你想改变你的表示(例如间隔),那就不一样了。完美的工作是一个不可变的容器。不幸的是C++标准没有这样的概念。而Sturness是唯一的,但是很差的代理。STL不是魔术。如果你需要一个集合中的K个数字,你需要O(k)。如果你想改变你的表示(例如间隔),那就不一样了。完美的工作是一个不可变的容器。不幸的是C++标准没有这样的概念。而Snice是唯一的,但是很差的代理…NITCODY:分配内存来保存N个数字可以是O(1)。时间。是的,我想这是真的。O(n)与calloc,虽然(同样,使用Omega(n)而不是O(n),是的,我自己掉进了陷阱:-)挑剔:分配内存来保存n个数字可能是O(1)。是的,我想这是真的。O(n)和calloc,但是(同样,用ω(n)代替O(n),和