草庐IT

c++ - 保留容量会导致两次分配还是一次分配?

std::vectorvec;//line#1vec.reserve(100);//line#2我想知道第1行是否触发了一个小的分配(例如,10Ts的内存),或者第一个分配是否发生在第2行。标准对此有任何说明吗? 最佳答案 它是实现定义的。vector的默认构造函数不需要分配任何东西,但实现这样做是允许的。 关于c++-保留容量会导致两次分配还是一次分配?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

c++ - 在将大小较大的 vector move 到容量较小的 vector 之前,是否可以通过使用 reserve() 来提高代码性能?

如果这个问题不完整、不清楚或重复(这是我的第一个问题),请提前道歉。在研究move语义和为我的OOP类(class)做一个小项目时,我偶然发现了一个我自己无法回答的问题。据我所知std::move()通过将l值转换为r值来工作,但假设我们将一个包含很多元素的vectormove到容量为1的第二个vector中。我可以使用reserve()避免由于std::move()将r值move到第二个vector中,第二个vector的大量自动内存重新分配或者使用reserve()没有效果?可以在下面找到我的问题的简单实现。#include#include#includeintmain(){std

c++ - std::string 容量大小

字符串的容量大小总是15的倍数吗?例如:在所有情况下容量都是15strings1="Hello";strings2="Hi";strings3="Hey";还是随机的? 最佳答案 Isthecapacitysizeofstringalwaysamultiplevalueof15?没有;关于std::string容量的唯一保证是s.capacity()>=s.size()。一个好的实现可能会以指数方式增加容量,以便每次需要重新分配底层数组时它的大小都会加倍。这对于std::vector是必需的,因此push_back可以具有摊销常数时

C++ OpenCV cv::Mat 的最大存储容量

在我的程序中,我加载了一些图像,从中提取了一些特征并使用cv::Mat来存储这些特征。根据我知道的图像数量,cv::Mat的大小为700.000x256(行x列),约为720Mb。但是当我运行我的程序时,当它达到大约400.000x256(400Mb)并尝试添加更多时,它只会因fatalerror而崩溃。谁能确认400Mb确实是cv::Mat存储容量的限制?我应该检查更多问题吗?解决这个问题的可能方法? 最佳答案 挖掘源代码,使用push_back:它检查是否有足够的空间容纳新元素,如果没有,它会重新分配矩阵,空间为(current

c++ - "reserve or shrink"的正确方法指向已知 future 容量需求的 vector

我已经围绕一个长期存在的vector的共同主题编写了无数软件模块,有时(以未指定的频率)必须更新其内容。惯用语实现:voidLongLived::reconfigure(constInputT&whatever_input){m_vector.clear();m_vector.reserve(whatever_input.size());populate(m_vector,whatever_input);}请注意,惯用的实现方式永远不会减少其内部缓冲区的容量。如果这不行怎么办?只需使用shr​​ink_to_fit(),我想:voidLongLived::reconfigure(con

c++ - std::vector 的容量会减少吗?

C++14finalworkingdraft对std::vector做出以下评论:Storagemanagementishandledautomatically,thoughhintscanbegiventoimproveefficiency.cppreference说:Thestorageofthevectorishandledautomatically,beingexpandedandcontractedasneeded.和WikipediaentryforDynamicarray说:C++'sstd::vectorandRust'sstd::vec::Vecareimplemen

c++ - pop_back() 可以减少 vector 的容量吗? (C++)

根据C++标准,是std::vector::pop_back()曾经允许减少vector的容量吗?我问是因为我想得到保证,以下代码不会抛出内存不足异常:my_vec.pop_back();if(...)my_vec.push_back(...);假设my_vec是一个std::vector.我猜有三种可能:是的,根据C++03和C++11这可能发生。不,C++11禁止这样做(但C++03不禁止)。不可以,C++03和C++11都禁止这样做。是的,我的问题与Doesstd::vector.pop_back()changevector'scapacity?有关,但我的问题具体是关于标准保证

c++ - 为什么在达到容量后在 vector 中完成插入时 C++ 不处理迭代器?

我写这段小代码只是为了看看迭代器实际上是如何失效的,并且在达到其容量后不指向vector的更改位置。这里vector和capacity的大小最初都是5。之后,我在vector中插入了一些其他元素,并且没有重新初始化我的迭代器以指向myvector.begin()。当再次打印vector的元素时,这会导致maximumsizeofvectoris:1073741823在我的输出中出现垃圾值49。我的问题是,为什么在所有元素都被复制到新位置后,C++没有再次将点迭代器指向有效的myvector.begin()?这也可能导致一些难以调试的行为。我知道一种安全的工作方式是始终在使用迭代器之前重

c++ - 空 vector 的容量是多少?

看起来是个愚蠢的问题。但是评论我的answerSO问题之一让我重新思考。[评论说,空vector的容量不必为零]默认情况下,我的答案是0,因为vector中没有元素。将容量保持为0是有意义的,并且在第一次分配时可以增加容量而不会影响性能。但是标准并没有说明这一点。(我也查看了Josuttis的书)。它纯粹是特定于实现的吗?是否有任何STL供应商使用任意数字作为空vector的容量?任何想法... 最佳答案 C++标准23.2.4.2只说vector::capacity是Thetotalnumberofelementsthatthev

c++ - 在保持容量的同时重置字符串

我在这里阅读了很多关于如何完全清除字符串(即重置容量、释放内存)的问题。但我的问题恰恰相反;有没有可靠的方法来重置字符串(长度)同时保证其容量保持不变?示例:在循环中重用临时字符串。如果我做类似的事情,这可能会默认发生str.clear()str.reserve(256)在每个循环迭代中,至少在根据这篇文章的答案使用VisualStudio时:Specificbehaviourofstd::stringonvisualstudio?但依赖“可能”似乎有点冒险。 最佳答案 根据http://en.cppreference.com/w/