草庐IT

c++ - 谁为不通过 const 引用付出代价

给定:voidfoo(std::vectorv);voidbar(){std::vectorv=...;//manyitemsfoo(v);}分析工具中的什么会显示为热路径?会是std::vector吗?的复制构造函数、运行时还是操作系统?我记得在学校(我不是C++开发人员,只是和一些人一起工作)这将复制v这可能需要时间。我知道像这样的签名:voidfoo(conststd::vector&v);避免了这种可能代价高昂的复制操作。 最佳答案 正在复制std::vector按值(value)可能会做三件事:内存管理器(C++运行时或自

c++ - std::vector<>::emplace_back() 中的异常安全吗?

在std::vector::emplace_back()中抛出异常时会发生什么?例如:classFoo{public:Foo(intbar){if(bar==4)throwstd::exception("Somethingwentwrong");}}和std::vector>foo_list;foo_list.emplace_back(newFoo(3));try{foo_list.emplace_back(newFoo(4));}catch(std::exceptionerror){//Howbadisit?}//Whatsinsidefoo_listnow?我希望vector只包含

c++ - 1亿节点大图的C++表示

我正在处理一个非常大的图,它有5亿个节点,节点的平均度为100。所以它是一种稀疏图。我还必须存储每条边的权重。我目前正在使用两个vector,如下所示//Vcouldbe100millionvector*AdjList=newvector[V];vector*Weight=newvector[V];使用vector的vector似乎不节省空间。它需要超过400GB的存储空间。有没有更好的节省空间的方法来将这个大图存储在内存中?有使用任何C++库的建议吗? 最佳答案 初步说明您可以考虑使用vector的vector而不是使用动态内存分

c++ - vector move 构造函数比复制构造函数慢

我正在开发我的第一个C++项目,它是一个CSV解析器(fullsourcecodehere)。它正处于工作状态,现在我想进行基本的重构/提高性能。目前解析器的工作方式是将每一行作为std::vector返回,我想与其每次都分配一个新的vector和一个新的字符串,不如我有一个内部vector和一个带有保留内存的内部字符串,我会一次又一次地清除。这行得通,我开始查看其他可能进行内存分配的地方,我看到了这个复制内部vector然后清除它的函数:autoadd_row()->std::vector{autorow(m_bufvec);m_bufvec.clear();returnrow;}我

c++ - 嵌套 vector 与连续数组的性能影响

是否有任何可靠的测试可以清楚地显示访问和写入嵌套vector与C++的内置数组之间的性能差异?我听说与访问单个数组中的元素(所有元素都存储在连续内存中)相比,使用嵌套(多维)vector通常会产生一些性能开销,但这对我来说似乎都是假设。我还没有看到任何实际显示这些差异的测试。它们重要吗?我确信这取决于场景,但作为一个没有经验的程序员,我不太确定这些差异在多大程度上会变得显着。 最佳答案 这绝对取决于场景,在某种程度上,我认为不可能以一般方式回答哪种方法最快。最快的方法是访问模式具有最佳数据局部性的方法——这在很大程度上取决于访问模式

c++ - 引用 vector 中的对象(现代 C++)

如果这很简单,我很抱歉,但我已经15年没有玩过C++了。考虑这个简单的例子:vector包含A类型的对象。B类的对象必须引用驻留在vector中的A对象。(编辑澄清-类B必须有一个引用A实例的成员)在过去,您只需声明一个A*就可以了,但是今天如何使用智能指针来完成呢?我不想在vector中存储共享或唯一指针,因为我不想在整个堆上分配A对象。它们必须在vector本身中。 最佳答案 根据您的要求,您有几个选项。非拥有原始指针A*在现代C++中使用非拥有原始指针并没有错。如果B需要对A的可空引用和A可以保证比B长寿那么原始指针就完全没问

c++ - 涉及STL排序算法的令人困惑的SegFault

我正在尝试使用STL重新创建编程明珠第15栏中的程序。我正在尝试使用字符串和索引vector创建后缀数组。我将我读取的单词列表记录在一个名为input的字符串中,该字符串充当我在程序开头从stdin读取的以''分隔的单词列表。在我到达代码的排序部分之前,一切都按预期工作。我想使用STL的排序算法,但我对我似乎正在创建的段错误感到完全困惑。我有:vectorwords;和全局变量stringinput;我定义了我的自定义比较函数:boolwordncompare(unsignedintf,unsignedints){intn=2;while(((f当我运行代码时:sort(words.b

c++ - std::vector 可以 ='d 到另一个 std::vector 吗?

假设我有以下内容:std::vectormyints;然后我有一个返回intvector的函数:std::vectorGiveNumbers(){std::vectornumbers;for(inti=0;i然后我可以做:myints=GiveNumbers();这样做是否安全,使myints中只有数字0到49而没有其他内容?这样做会清楚以前在myints中的内容吗?如果不是,正确的方法是什么?谢谢 最佳答案 是的。这是安全的。您会将GiveNumbers()函数的结果复制到myints中。这可能不是最有效的方法,但它是安全和正确的

c++ - 如果我不遵守无状态自定义分配器教条,会发生最糟糕的情况吗?

我需要为std::对象创建自定义分配器(特别是最初是为std::vector),但它最终可能会使用其他分配器我需要创建自定义分配器的原因是我需要跟踪应用程序各个组件分配的(堆和堆栈)资源(这是应用程序的固有特性)。我将需要自定义分配器来监视资源的堆部分,因此我必须能够向std::vector构造函数传递类似于trackerIdidToTrackUsage;myAllocaallocator(idToTrackUsage);vectorFoo(allocator);然而,在阅读了一些之后我发现了这个关于STL/C++标准的小炸弹(见引用资料)说给定类型的所有分配器实例应该是等价的(也就是

c++ - 将 MPL vector 转换为静态数组

我写了一些代码来生成一个boost::mpl::vector用作阶乘函数的查找表,作为对开发人员可能使用的更通用的库函数的测试能够以静态基元数组的形式生成查找表。该函数(最有可能实现为预处理器宏定义)将接受要初始化的数组的名称和大小,以及用作初始化每个元素的元函数的类模板的名称i的数组。我认为在不使用外部脚本的情况下执行此操作的最佳方法是创建一个boost::mpl::vector,如下面的代码list所示,并将数组中每个元素的用户提供的元函数的返回值推送到vector;使用vector的元素初始化静态数组(可能通过使用一系列宏,最后一个宏将使用__VARARGS__宏来完成此操作)。