草庐IT

c++ - std::set 的 union 操作

这个问题在这里已经有了答案:Mergemultiplesetselementsinasingleset(4个答案)appendsettoanotherset(2个答案)关闭8年前。标准库中没有这样的函数吗?setset::union(setother)甚至这个?setgetUnion(seta,setb)set_union只是名称上的正确函数。它也可以对vector进行操作,这意味着它可能不如set-only函数高效。我不是追加。追加会破坏原始集。我想要一个代表联盟的新集。

c++ - socket编程,什么是FD和SD

我正在编写一个SSL套接字,我多次看到名称中带有FD或SD的东西(变量名、函数...)。例如,OpenSSL提供了功能:intfd=SSL_get_fd(...);在许多教程中(here、here和here),使用的是:intsd=socket(...);谁能解释一下,FD和SD分别代表什么?谢谢 最佳答案 SSL_get_fd:SSL_get_fd()returnsthefiledescriptorFileDescriptor:InUnixandrelatedcomputersoperatingsystems,afiledescr

c++ - 使用 set.insert( key ) 作为条件?

我正在尝试使用set.insert(key)作为条件,如果正确插入key(意味着该key不存在于集合中)那么它应该继续并执行某种代码。例如,像这样的东西:if(set.insert(key)){//somekindofcode}这是允许的吗?因为编译器抛出这个错误:conditionalexpressionoftype'std::_Tree::iterator'isillegal 最佳答案 采用单个键值的插入版本应返回std::pair,其中bool表示是否进行了插入。值true表示已插入该值,false表示该值已存在。所以你的条件

c++ - std::set::equal_range 有什么用?

由于std::set不能包含重复元素并且总是排序的,std::set::equal_range将始终返回没有元素或只有1个元素的范围.从技术上讲,是的,这仍然是一个范围,但是这个算法的目的是什么?对于std::set来说似乎完全没有必要。 最佳答案 我只是猜测。但是,likecount(),当您在模板中并且不想确定您是在std::set还是其他关联容器上操作时,它有一些值(value)。基本上,这是为了保持一致性。该函数确实按照宣传的那样执行,只是它有问题使用versus如果您孤立地使用find()之类的东西。如果您真的想要开箱即用

c++ - 从 std::set::insert() 返回迭代器是常量?

这个问题在这里已经有了答案:HowcanIimprovethisdesignthatforcesmetodeclareamemberfunctionconstanddeclarevariablesmutable?(3个答案)关闭9年前。根据C++引用,set::insert应该返回对,其中迭代器指向新插入的元素或现有元素(如果存在)。但是我在给迭代器赋值时遇到了问题,正如这个简单的例子所示:intmain(){setset;*set.insert(5).first=5;return0;}我已经尝试过G++和Clang,但都不起作用。set.cc:7:24:error:read-only

c++ - zmq-cpp : recv() waits for data despite ZMQ_DONTWAIT being set

我正在尝试使用ZMQ_DONTWAIT标志通过ZeroMQ实现非阻塞接收方法,但是recv()的行为就像在没有标志的情况下被调用:autostart=std::chrono::steady_clock::now();autohave_data=sock_->recv(&reply,ZMQ_DONTWAIT);autoduration=std::chrono::duration_cast(std::chrono::steady_clock::now()-start).count();std::coutsock_是一个zmq::socket_t实例化为REQ套接字。在这种情况下,have_

c++ - 为什么将多个元素同时插入 std::set 会更快?

我正在阅读:"TheC++StandardLibrary:ATutorialandReferencebyNicolaiM.Josuttis"我在有关Sets和Multisets的部分。我遇到了关于插入和删除元素的一行:"Insertingandremovinghappensfasterif,whenworkingwithmultipleelements,youuseasinglecallforallelementsratherthanmultiplecalls."我远不是数据结构大师,但我知道它们是用红黑树实现的。我不明白的是,STL实现者将如何编写算法以更快的方式一次插入多个元素?谁

c++ - 只要集合不变,迭代器是否以相同的顺序迭代 boost::unordered_set 或 boost::unordered_map?

只要set或map不变,迭代器是否以相同的顺序遍历boost::unordered_set或boost::unordered_map? 最佳答案 HashMap的某些实现会将散列到同一容器的项目重新排序,将最近访问的项目放在列表的前面,作为优化。这将改变顺序。我不知道boost::unordered_map会这样做,但将来您可能最终会用std::unordered_map代替,这将完全取决于您的编译器的实现。 关于c++-只要集合不变,迭代器是否以相同的顺序迭代boost::unorde

c++ - 是否可以将项目从 std::set 中移出?

如果我有一个只允许移动语义的对象——是否可以从集合中移动项目?我似乎无法找到执行此操作的方法。 最佳答案 C++17添加了一个函数std::set::extract允许将对象移出集合:std::sets;s.emplace(arg0,arg1,arg2);//onlywaytoinsertsuchmove-onlyobjects,sinceC++11autointernal_node=s.extract(s.begin());//internal_nodenolongerpartofset,wecandowithitwhatwewa

c++ - O(logn) 中 std::set begin() 和 std::set 迭代器之间的距离

我需要在std::set中找到一个元素的索引。该索引可以可视化为迭代器距起点的距离。一种方法可以是:for(inti=0,set::iteratorit=s.begin();it!=iteratorToBeFound;++it,++i);这显然需要O(n)的时间。但是我们知道,set内部实现的二叉搜索树到根的距离可以在O(logn)时间内找到。他们有什么方法可以实现在C++集合中以O(logn)时间查找索引吗? 最佳答案 您可以使用函数std::set::find搜索元素x并计算distance到集合的第一个迭代器。std::dis