草庐IT

STL容器之queue

全部标签

c++ - 使用快速排序对可能包含无穷大的容器进行排序是否安全?

我已经意识到,为了快速排序,所有无穷大都必须相等。换句话说,这样的标准是不够的:classEntity{public:floatvalue()const;boolvalueIsInfinite()const;};classCriterium{booloperator()(Entityleft,Entityright)const{if(left.valueIsInfinite())returnfalse;returnleft.value()container;qSort此排序失败,因为根据标准并非所有无穷大都相等。不等式取决于实体进入运算符的顺序。我发现,这样的排序失败了。我需要这样的东

c++ - 在 STL 优先级队列 C++ 中实现 decreaseKey

我正在尝试实现Prim算法,为此我需要为优先级队列设置一个decreaseKey方法(以更新优先级队列中的键值)。我可以在STL优先级队列中实现它吗?如果有帮助,这是我正在遵循的算法:对于图G中的每个顶点u将u的键设置为INFINITY将你的父级设置为NIL将源顶点的键设置为0使用上述键将图中所有顶点入队到优先级队列Q当Q不为空时用Q中最低的键弹出顶点u对你的每个相邻顶点v做如果(v仍在Q中)和(key(u)+weight-function(u,v)设置你为v的父级将v的键更新为相等的键(u)+权重函数(u,v)//这部分给我带来了问题,因为我不知道如何在优先级队列中实现decreas

c++ - 处理容器中的 unique_ptr

我有一个指向模型、网格等的unique_ptrvector,如下所示:std::vector>mLoadedModels;我选择unique_ptr是因为它会在vector析构函数时自动释放数据,还因为稍后如果我需要重新加载所有模型(由于OpenGL上下文拆除/创建)我可以在我的资源管理器内部重置()并使其指向一个新的模型实例,它不会影响系统的其余部分。但我的问题是,您将如何与其他系统共享vector的内容?您不能只传递unique_ptr,因为那会改变所有权(由于它的unique_ptr),我希望在资源管理器中拥有唯一所有权。我想出的解决方案如下,将访问包装在以下结构中:templa

c++ - 在容器中存储多重继承对象

我使用的库有很多类型,所有类型都派生自相同的2个接口(interface):classHuey:publicIDuck,publicICartoonCharacter{...};classDewey:publicIDuck,publicICartoonCharacter{...};classLouie:publicIDuck,publicICartoonCharacter{...};我想将上述所有类型的对象存储在一个包装类中,并将该包装类的对象粘贴在一个容器中。当然,我应该能够从我的包装器类中调用属于这两个接口(interface)的方法。我在这里有哪些选择?我能想到将IDuck*存储

c++ - 作为 std::vector 包装器的用户定义容器应该继承还是包含 std::vector?

作为std::vector包装器的用户定义容器应该继承还是包含std::vector?我有一个应该是容器的类。我看到两个选项:1)从vector继承2)有一个私有(private)成员vector并覆盖所有vector函数以使我的容器充当vector我不确定这是否只是风格的问题,还是从根本上来说更好比另一个?我想添加的额外功能很小,这里的数据成员和函数很少在那里。大多数情况下,处理vector中的数据将是方便的功能。 最佳答案 首先,STL容器不应该被继承。他们甚至没有虚拟析构函数。其次,选择组合/聚合而不是继承总是更可取的,因为这

c++ - 来自函数参数的容器的 decltype

我试图从函数的参数中推导出函数内部STL容器的类型,但它没有编译:autobattery_capacity(constvector&v)->decltype(v)::value_type{decltype(v)::value_typeb=0;returnb;}错误:main.cpp:10:52:error:'decltype(v)'(aka'constvector&')isnotaclass,namespace,orscopedenumerationautobattery_capacity(constvector&v)->decltype(v)::value_type{^main.cp

c++ - STL priority_queue<pair> 与 map

我需要一个优先级队列来存储每个键的值,而不仅仅是键。我认为可行的选择是std::multi_map因为它按键顺序迭代,或std::priority_queue>因为它在V之前在K上排序。除了个人偏好之外,我有什么理由更喜欢另一个吗?它们真的一样吗,还是我漏掉了什么? 最佳答案 优先级队列最初是在O(N)时间内排序的,然后以降序迭代所有元素需要O(NlogN)时间。它存储在std::vector中在幕后,所以在大O行为之后只有很小的系数。不过,其中一部分是在vector内部移动元素。如果sizeof(K)或sizeof(V)很大,会慢

c++ - C++ 中的分配器用法(STL 树)

我最近一直在尝试了解C++分配器的工作原理,并且一直在寻找STL库用于类似std::set之类的红黑树的实现。或std::map,但有些事情我无法理解。首先要做的是从容器必须存储的类型转换分配器-_Val-树使用的节点类型-_Rb_tree_node-使用重新绑定(bind)模板:typedeftypename__gnu_cxx::__alloc_traits::templaterebind>::other_Node_allocator;typedef__gnu_cxx::__alloc_traits_Alloc_traits;这个我可以解决。现在,当一个元素被插入并且它需要创建一个新

c++ - 如何通过索引递增的generate_n填充STL容器

要用依赖于索引的值填充STL容器,我通常会像下面的代码那样编写。有没有办法在不声明索引的情况下做同样的事情?intmain(){staticintN=10;autofunc=[](intidx){returnidx*(idx+1)+1;};intidx=-1;std::listlst;std::generate_n(std::back_inserter(lst),N,[&](){idx++;returnfunc(idx);});} 最佳答案 您可以将索引移动到lambda捕获中并使lambda像这样可变(需要C++14):std::

c++ - C++ STL中set的 'insert'函数的原理是什么?

对于下面这段代码:intmain(){std::sets;for(inti=0;ival当符号'structNode{intval;Node(int_val=-1):val(_val){}booloperatorp.val;}};当我把函数改成这样时:booloperator=p.val;}输出变为:'5443210'。差异让我感到困惑,有人可以解释为什么会发生这种情况并解释“插入”功能的原理吗? 最佳答案 std::set使用operator默认情况下在key类型上,因此在第一种情况下,它使用operator为Node定义比较键,