草庐IT

STL-Like

全部标签

c++ - 使用字符串数组 : arrays of pointers - Are they like multidimensional arrays?

我最近一直在阅读C++fordummies,要么书名用词不当,要么他们不指望我。在关于使用带有字符串的指针数组的部分中,他们展示了一个函数,我完全被难住了,不知道该转向哪里。char*int2month(intnMonth){//checktoseeifvalueisinrangif((nMonth12))return"invalid";//nMonthisvalid-returnthenameofthemonthchar*pszMonths[]={"invalid","January","February","March","April","May","June","July","A

STL之stack+queue的使用及其实现

STL之stack+queue的使用及其实现1.stack,queue的介绍与使用1.1stack的介绍1.2stack的使用1.3queue的介绍1.4queue的使用2.stack,queue的模拟实现2.1stack的模拟是实现2.2queue的模拟实现3.总结所属专栏:C“嘎嘎"系统学习❤️🚀>博主首页:初阳785❤️🚀>代码托管:chuyang785❤️🚀>感谢大家的支持,您的点赞和关注是对我最大的支持!!!❤️🚀>博主也会更加的努力,创作出更优质的博文!!❤️1.stack,queue的介绍与使用1.1stack的介绍stack的文档介绍stack是一种容器适配器,专门用在具有后进

c++ - STL 容器的元素生命周期

我正在尝试将对象保存在STL容器(在本例中为vector)中,并希望容器在对象销毁时销毁对象,但我不太清楚细节。我不想这样做的一种方法就是像这样简单地使用它vectormyVec;myVec.push_back(MyClass(...));由于这里的构造函数被调用了两次(在上面的代码中调用一次,然后在vector中复制构造函数)和析构函数一次。最直接的替代方法是使用指针来存储动态分配的对象,但是MyClass的析构函数不会在vector析构时被调用。存储auto_ptr而不是普通指针会在myVec.push_back(...)处产生错误。在让容器的析构函数调用元素的析构函数时,有没有办

C++ STL vector 迭代器与索引访问和线程安全

我正在迭代一个STLvector并从中读取值。还有另一个线程可以更改此vector。现在,如果另一个线程从vector中插入或删除元素,它会使迭代器无效。不使用涉及的锁。我选择通过索引(方法1)代替迭代器(方法2)访问容器是否使其线程安全?性能怎么样?structA{inti;intj;};方法一:size_ts=v.size();//vcontainspointerstoobjectsoftypeAfor(size_ti=0;ii++;}方法二:std::vector::iteratorbegin=v.begin();std::vector::iteratorend=v.end();

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++ - 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定义比较键,

c++ - 带有自定义模板的 STL 迭代器

我有以下模板方法,templatevoidClass::setData(vectordata){vector::iteratorit;}我收到以下编译错误(XCode/gcc)error:expected`;'before'it'我发现其他人也有类似的问题here(readdowntoseeit'sthesameeventhoughitstartsoutwithadifferentissue)但他们似乎已经通过更新VisualStudio解决了。这让我猜测这是一个编译器问题,它应该编译,对吗?通过从0到size的索引进行迭代是可行的,但这不是我更愿意实现此功能的方式。还有另一种解决方法