草庐IT

STL容器之queue

全部标签

c++ - 如何强制清除 STL 内存缓存?

我有一个类,它有一个unordered_map类型的字段。我在我的应用程序中创建了该对象的单个实例,它被包装在shared_ptr中。该对象非常耗费内存,我想在使用完后立即将其删除。然而,重置指针只是释放了对象占用的一小部分内存。如何强制程序释放对象占用的所有内存?以下模拟程序重现了我的问题。for循环打印垃圾只是为了让我有足够的时间观察top使用的内存。析构函数在reset()之后被调用。此外,紧接着,使用的内存从大约2GB下降到1.5GB。#include#include#includeusingnamespacestd;structA{~A(){cerrindex;};intma

将PHP容器连接到MySQL的Docker

我有两个容器,一个Apache-PHP容器和一个MySQLDB容器。我正在尝试使我的PHP脚本查询我的SQL数据库。但是,我收到以下错误;Fatalerror:UncaughtPDOException:PDO::__construct():php_network_getaddresses:getaddrinfofailed:Nameorservicenotknown和Fatalerror:UncaughtPDOException:SQLSTATE[HY000][2002]Nosuchfileordirectory在切换主机地址时,我认为我缺少对Docker的基础,这使我疯狂。我的Docker作

c++ - 选择什么标准容器(如果有)?

我需要一些内存管理,希望我可以将其基于一些std容器。我的要求是:元素只有一个默认构造函数(没有复制,没有移动,没有别的)容器可以通过一小块连续的元素扩展(在后面)我什至可以粗略地知道我总共需要多少元素,甚至可以随时知道最终需要多少元素。不过,这些都是估计值。我真的不需要迭代器,但获取元素运行编号的方法会很方便。所以,我需要一些可以通过添加block来扩展的东西,比如std::deque.但是用std::deque,我不能保证扩展,比如说,8个元素,给我一个连续的block。和std::deque没有capacity所以我不能从std::deque中“适应”.这意味着我必须自己编写,对

C++ 简洁地检查 STL 容器中的项目(例如 vector )

boolxInItems=std::find(items.begin(),items.end(),x)!=items.end();是否有更简洁的方法来检查x是否在项目中?这似乎不必要地冗长(重复项目三次),这使得代码的意图有点难以阅读。比如有没有类似下面的东西:boolxInItems=boost::contains(items,x);如果不存在任何更简洁的boost/STL算法来检查集合是否包含项目,那么使用辅助函数来启用contains(items,x)?我是否使用了错误的STL容器?即使是std::set也会导致boolxInItems=items.find(x)!=items.

c++ - 如何在 C++11 中将容器 std::array<type, size> 用于多维数组?

例如,包含三个整数的一维数组可以定义为std::arraymyarray或myarray[3].有没有像std::array这样的容器对于像myarray[3][3]这样的多维数组? 最佳答案 一个关键部分是确保{}初始化工作类似于std::array,并尽可能合理地让自己保持pod状。与std::array的兼容性也很重要,什么比std::array更兼容??所以我的解决方案从std::array中生成多维数组小号:templatestructmulti_array_helper{usingtype=T;};templateusi

c++ - 从 back_insert_iterator 中提取容器的 value_type 的特征类

std::back_insert_iterator的value_type等于void,但它还有一个protected成员container包含指向底层Container的指针。我正在尝试编写一个traits类来提取容器的value_type,如下所示:#include#include#includetemplatestructoutit_vt:OutputIt{usingself_type=outit_vt;usingvalue_type=typenamestd::remove_pointer_t().container)>::value_type;};intmain(){std::v

c++ - std::move 是否与左值引用一起使用? std::move 如何在标准容器上工作?

#includestructA{inta[100];};voidfoo(constA&a){std::vectorvA;vA.push_back(std::move(a));//howdoesmovereallyhappen?}intmain(){Aa;foo(a);}上面的代码编译正常。现在到处都写着move避免复制。以下是我的查询:move在处理左值时真的有效吗[非]-const引用?即使有“右值引用”,对象复制时如何避免复制像上面一样插入标准容器中?例如voidfoo(A&&a){//supposeweinvokethisversionstd::vectorvA;vA.push_

c++ - 不适合内存的随机访问容器?

我有一个对象数组(比如图像),它们太大而无法放入内存(例如40GB)。但是我的代码需要能够在运行时随机访问这些对象。最好的方法是什么?从我的代码的角度来看,当然,一些数据是在磁盘上还是临时存储在内存中应该无关紧要;它应该具有透明的访问权限:container.getObject(1242)->process();container.getObject(479431)->process();但是我应该如何实现这个容器呢?它应该只将请求发送到数据库吗?如果是这样,哪一个是最好的选择?(如果是数据库,那么它应该是免费的并且没有太多的管理麻烦,也许是BerkeleyDB或sqlite?)我是否

c++ - 在容器元素上应用函数需要更好的名称

我有一个容器类(包含一个多索引容器),我有一个公共(public)的“foreach”成员函数,因此用户可以传递一个仿函数以应用于所有元素。在实现时,我遇到了这样一种情况,即仿函数只能应用于容器中范围内的某些元素,因此我重载了foreach,以传递一些有效范围。现在,在某些情况下,在某个条件下停止是值得的,所以实际上,我让foreach根据函数的返回值停止。我对系统的工作方式很满意,但我有一个顾虑:应该如何调用范围内带有停止条件的“foreach”?谁知道一个通​​用、清晰和简洁的名称? 最佳答案 根据您的描述,我会选择apply_

c++ - std::map::begin() 之前的 STL 迭代器

在C++11的std::map中,是否有一些有效的迭代器x使得++x保证等于map::开始()?我想检测我刚刚调用的函数(我的)是否已经将迭代器从函数的前面移开。该函数会将迭代器恰好向后移动一个位置。答案是否适用于图书馆的其他人? 最佳答案 不,std容器中开始之前的迭代器都是UB(反向迭代器除外,它可能无法解决您的问题)。您可能需要修复有问题的函数。如果做不到这一点,请将其包装起来并在调用它之前捕获不良行为。如果做不到这一点,您可以在map键类型排序中插入一个负无穷大元素,并添加一个标记值。如果做不到这一点,您可以编写迭代器适配器