在c ++中用于std :: set时,'advance'的运行时复杂度是多少?

问题描述

我对std::advance()用于std::set时的运行时复杂性感到好奇。

例如

std::set<in> s;
auto x=s.begin();
advance(x,n/2);

上面的代码花费多少时间(n的顺序)。

解决方法

tcpclient1.RemoteHost :=ReadString('common','glsboxhost','<IP>'); tcpclient1.Remoteport :=ReadString('common','glsboxport','<PORT>'); if TcpClient1.Connect then begin TcpClient1.Sendln(myboxupdate); myboxreturn:=tcpclient1.Receiveln(#$a#$d); TcpClient1.Disconnect; end; 具有双向迭代器。双向迭代器是可递增和可递减的,但不能对随机访问进行寻址-意味着到达第std::set n个节点需要递增N次。

这意味着前进N将为O(N)

,

根据std::advance的文档,位于cppreference:

复杂度

线性。

但是,如果InputIt额外满足以下要求: LegacyRandomAccessIterator,复杂性是恒定的。

因此,除非您手上有一个LegacyRandomAccessIterator(例如int[100]中的一个),否则您将具有线性复杂度。但是,std::set仅具有LegacyBidirectionalIterator,它比随机访问要弱。

所以,在这里,您可以保证运行时线性。