草庐IT

c++ - 防止在 STL 容器中释放内存

我有一个经常重复使用的STL容器(std::list)。我的意思是我将一些元素插入容器在处理过程中移除元素清理容器冲洗并重复多次当使用callgrind进行分析时,我看到大量调用new(malloc)和delete(free)这可能非常昂贵。因此,我正在寻找某种方法来优先预分配相当多的元素。我还希望我的分配池继续增加,直到达到高水位线,并且分配池继续卡在内存上,直到容器本身被删除。不幸的是,标准分配器会不断调整内存池的大小,因此我正在寻找能够执行上述操作而无需自己编写的分配器。是否存在这样的分配器,我在哪里可以找到这样的分配器?我在使用GCC的Linux和使用STLPort的Andro

c++ std将列表复制到 map

考虑以下几点:structA{inti;doubled;std::strings;};std::listlist_A;我想将list_A的所有元素复制到map中,这样map中的每一对都将包含list_A中的一个元素作为值,其字符串s作为键。有没有比遍历列表并将每个元素及其字符串作为键插入映射更优雅的方法? 最佳答案 我喜欢标准库算法和lambda,但它并没有比以下更简单:for(constA&value:list_A){map_A.insert(std::make_pair(value.s,value));}其他方法正在执行与此代码

c++ - 为什么这个简单的线程代码会失败?

我正试图做到这一点,我不能从循环中调用线程。但是当我运行它时,我得到一个运行时错误:terminatecalledafterthrowinganinstanceof'std::system_error'what():InvalidargumentThread#1#include#include#include#include#includestd::mutexm;staticintthread_count;autofoo=[&]{std::lock_guardlock(m);std::cout>threads(20,std::make_shared(foo));for(constaut

c++ - 有条件地将一个 vector 复制到另一个 vector 的最快方法

此问题与现有问题相关:fastwaytocopyonevectorintoanother我有一个vector源vectorS,我想创建一个目标vectorD,它只包含S中满足特定条件(比如元素是偶数)的那些元素。请注意,源vector是常数vector。我可以想到两种STL算法来做到这一点:复制_if删除_if在这两种方法中,我都需要确保目标vectorD足够大。因此,我将需要创建与S大小相同的初始vectorD。此外,在这两种方法中,我都希望将vectorD压缩为与其中元素数相同的长度。我不知道哪一个更快或更方便,但我不知道有条件地复制vector的更好方法?

c++ - g++ 4.9.3 提示 friended ctor 对 .emplace_back() 是私有(private)的,但喜欢 .push_back()

我肯定遗漏了关于emplace()和friend的其中一个优点。这是一个完整的最小示例,它重现了g++4.9.3的问题:classFoo{public:classBar{private:friendclassFoo;Bar(Foo&foo):foo(foo){}Foo&foo;};Bar&getBar(){//bars.push_back(*this);//worksfinebars.emplace_back(*this);//Foo::Bar::Bar(Foo&)isprivatereturnbars.back();}private:std::vectorbars;};

c++ - 按值删除 map 元素

我会保持简短。我试图在字符串和对象指针之间保留一个映射,因此,我使用std::map。我有一个管理器,它是一个跟踪map的全局类,每当调用对象的析构函数时,它都会告诉管理器它已被删除。我能想到的唯一方法就是在map上搜索对象。这个问题有有效的STL解决方案吗?是否存在可以高效地通过键进行搜索的map? 最佳答案 不,除了通过比较值进行迭代之外,没有一种有效的方法可以使用std::map执行此操作。然而,大多数情况下,值的键可以从值本身计算得出。例如,使用Person对象的Name属性作为键。管理器是否可以存储键/值对列表而不是值本身

c++ - 如何使用 boost lambda 用新对象填充指针 vector

我最近开始使用boostlambda,我想我会尝试在它会/应该使事情更容易阅读的地方使用它。我有一些类似下面的代码std::vectorv;for(inti=0;i稍后,删除它...std::for_each(v.begin(),v.end(),boost::lamda::delete_ptr());整齐地整理。但是,我想我应该尝试使用lambda来“lambda化”vector的总体......然后烟火开始了......我试过了..std::generate_n(v.begin(),20,_1=newX());但这引发了各种编译器错误。实现此目标的最佳“lambda”方式的任何想法。

c++ - "contains string"的快速索引

在我的应用程序中,我有多达数百万个短字符串(大多数短于32个字符)。我想实现一个带有附加列表的搜索框,该列表仅包含包含在搜索框中输入的整个字符串的元素。我怎样才能预先建立一个索引来快速找到这样的字符串?所有排序的STL容器检查整个字符串。对于输入的搜索字符串“str”,我需要找到所有包含“str”的字符串:“mainstreet”、“struve”、“ustr”等。 最佳答案 您可以构建一个Permutermindexes.对于“struve”,您将插入Radixtree(或通用搜索树):struve$truve$sruve$stu

c++ - 使用 const char[] 或 const std::string 哪一个?

哪个对字符串文字更好,标准字符串还是字符数组?我的意思是说常量字符串,比如说constcharname[]="so";//ortouseconststringname="so"; 最佳答案 对于字符串文字,并且仅对于来自文字的字符串常量,我会使用constchar[]。std::string的主要优点是它有免费的内存管理,但这不是字符串文字的问题。它是文字的实际类型,它可以直接用于任何需要旧C样式空终止字符串或C++字符串(隐式转换开始)的API。您还可以通过使用数组而不是指针来获得编译时大小的实现。现在,在定义函数接口(inter

c++ - Std List、Vector、Map 等占用的空闲内存

来自C#背景,我对C++上的内存管理只有最模糊的想法——我所知道的是我必须手动释放内存。因此,我的C++代码是以这样一种方式编写的,即std::vector类型的对象。,std::list,std::map可以自由实例化、使用,但不释放。直到我快完成我的程序时我才意识到这一点,现在我的代码由以下几种模式组成:structPoint_2{doublex;doubley;};structPoint_3{doublex;doubley;doublez;};list>Computation::ComputationJob(listpts3D,vectorvectors){mappt2DMap=