草庐IT

stl-algorithm

全部标签

c++ - push_back 如何在 STL vector 中实现?

我在一次采访中被问到这个问题。我回答的点是这样的1)指向当前位置的索引;2)必要时调整大小。谁能详细说明一下? 最佳答案 STLvector有一个size(当前存储元素的数量)和capacity(当前分配的存储空间)。如果size,一个push_back简单地将新元素放在末尾并递增size1.如果size==capacity在push_back之前,分配了一个新的更大的数组(两倍大小是常见的,但这是依赖于实现的afaik),所有当前数据都被复制(包括新元素),并释放旧分配的空间。如果分配失败,这可能会引发异常。操作的复杂性是摊销O(

c++ - 使用 STL 将大型 STL vector 写入文件的最快方法

我有一个很大的字符vector(10^9个元素),我想知道将这种vector写入文件的最快方法是什么。到目前为止,我一直在使用下一个代码:vectorvs;//...Fillvectorwithdataofstreamoutfile("nanocube.txt",ios::out|ios::binary);ostream_iteratoroi(outfile,'\0');copy(vs.begin(),vs.end(),oi);对于此代码,将所有数据写入文件大约需要两分钟。实际问题是:“我能否使用STL使其更快以及如何”? 最佳答案

c++ - STL的意义何在?

我已经使用C++编程大约一年了,当我四处寻找时,我看到了很多对STL的引用。有人能告诉我它的作用吗?以及它的优缺点?此外,它通过borlandsVCL或MFC给我带来了什么?谢谢 最佳答案 它是C++标准库,为您提供各种非常有用的容器、字符串、操作它们的算法等。术语“STL”已过时恕我直言,曾经的STL已成为C++标准库的重要组成部分。如果您正在进行任何严肃的C++开发,您将需要熟悉这个库,最好是boost图书馆。如果您还没有使用它,那么您可能在错误的抽象级别上工作,或者您将自己限制在C++的一个小子集上。

c++ - 为什么程序员有时引用 "C++/STL"就像它是一种单独的语言一样?

这似乎是一个微不足道的问题,但却是最近困扰我的问题。为什么有些程序员提到“C++/STL”时就好像它是一种不同的语言?STL是C++标准库的一部分——因此也是“C++”语言的一部分。它不是一个单独的组件,也不是单独存在于C++的范围内。然而,有些人一直表现得好像这是一种完全不同的语言。为什么? 最佳答案 有可能成为一名称职且经验丰富的C++程序员而从不使用STL。您可能正在使用Boost或ACE,或者是10年的MFCwindows程序员。如果您想要一个有使用STL经验的人,请一个了解C++的人并不能保证您会得到一个。另外,在我看来,

c++ - 在结构的 STL 映射中,为什么 "[ ]"运算符会导致结构的 dtor 被额外调用 2 次?

我创建了一个简单的测试用例,展示了我在处理的较大代码库中注意到的奇怪行为。这个测试用例如下。我依靠STLMap的“[]”运算符在此类结构的映射中创建一个指向结构的指针。在下面的测试用例中,行...TestStruct*thisTestStruct=&testStructMap["test"];...获取指针(并在map中创建一个新条目)。我注意到的奇怪之处在于,这一行不仅导致在映射中创建一个新条目(因为“[]”运算符),而且由于某种原因它导致结构的析构函数被额外调用两次。我显然遗漏了一些东西-非常感谢任何帮助!谢谢!#include#include#includeusingnamesp

c++ - 减少 STL 类型调试 View 中的噪音

TL;DR:是否可以为开发人员清除来自STL的长类型名称的visualstudio调试器/intellisense/编译器输出中显示的类型信息?C++,VisualStudio考虑代码:std::mapm;考虑中的类型信息监window口将鼠标悬停在标识符上Intellisense提示(方法的参数,图像格式为简洁)(如#3)在您键入名称时对标识符进行智能感知补全这些案例中的每一个都显示了STL容器的类型描述是一长串不常需要的细节。我注意到visualstudio2011现在显示string作为std::string(一个了不起的改进),而不是std::basic_string,std:

C++: Scott Meyers "Effective STL": item 31: know your sorting options: 帮助理解

美好的一天!ScottMeyers在他的“EffectiveSTL”中写道第三种方法是使用有序的迭代器容器中的信息,以迭代方式将列表的元素拼接到您希望它们所在的位置。如您所见,有很多选择。(第31项,第二部分)有人可以这样解释吗?更多文字(理解上下文):算法sort、stable_sort、partial_sort和nth_element需要随机访问迭代器,因此它们只能应用于vector、字符串、双端队列和数组。对标准关联容器中的元素进行排序是没有意义的,因为此类容器使用它们的比较函数来始终保持排序。我们可能想使用sort、stable_sort、partial_sort或nth_el

c++ - STL映射是如何分配的?堆栈还是堆?

我想知道c++中的STLmap是否具有连续内存-还是分配给堆的内存? 最佳答案 因为map是一个动态容器,它的元素的内存是动态分配的(无论那意味着什么(它取决于一个可配置的分配器)!).此外,map是一个基于节点的容器,因此每个元素都进入一个不同的、单独的分配(以便允许最大迭代器和引用非无效).元素几乎肯定在内存中是连续的,并且可能以反射(reflect)您添加它们的方式的方式分散。实际上,映射将实现为某种类型的平衡树,以实现对数查找、插入和删除时间。(如果您想要具有连续存储和对数查找时间的数据结构,请考虑排序vector。)

c++ - STL 中的写时复制支持

我刚刚在读aWikipediaarticleonCopy-on-write(很好奇有没有文件系统支持),被下面这段话惊到了:COWisalsousedoutsidethekernel,inlibrary,applicationandsystemcode.ThestringclassprovidedbytheC++standardlibrary,forexample,wasspecificallydesignedtoallowcopy-on-writeimplementations:std::stringx("Hello");std::stringy=x;//xandyusethesam

c++ - 如何将元素移出 STL 优先级队列

C++的STL优先级队列有一个voidpop()方法和一个constreftop()方法。因此,如果你想将元素移出队列,你必须这样做:Tmoved=std::move(const_cast(myQueue.top())));myQeue.pop();这有效地将top转换为非常量,以便它可以move(而不是复制)。我不喜欢这段代码,因为强制move可能会使优先级队列的不变量无效,这应该因为弹出而无关紧要,但事情可能出错。有没有更好的方法来完成弹出/move?为什么没有T&&top_and_pop()函数? 最佳答案 std::prio