如何解决在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,它比随机访问要弱。
所以,在这里,您可以保证运行时线性。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。