草庐IT

c++ - 删除 std::vector 的元素(并更改大小)而不影响分配的内存

coder 2024-02-25 原文

我正在使用如下代码:

const int MY_SIZE = 100000;
std::vector<double> v;
v.reserve(MY_SIZE);

// add no more than MY_SIZE elements to the vector

f(v);    
v.clear();

// again, add no more than MY_SIZE elements to the vector

f(v);
v.clear();

//
// etc...
//

我的代码的重点是存储 MY_SIZE double的然后执行操作 f(std::vector<double>)在那些元素上。在我填满 vector 并执行操作后,我想去掉所有元素(并将std::vector::size()重置为0),然后添加更多元素。但是,这里的关键是我不想想要更改为 vector 分配的内存空间。

请注意,我永远不会添加超过 MY_SIZE 的内容元素 v , 所以 v永远不需要重新分配比 v.reserve(MY_SIZE) 分配的内存更多的内存.

所以,当我调用 v.clear()在上面的代码中,它会以任何方式影响 v.reserve(MY_SIZE) 分配的空间量吗?或 v.begin() 在内存中的位置?


相关问题:如果我调用v.erase(v.begin(),v.begin()+v.size()) ,它会以任何方式影响 v.reserve(MY_SIZE) 分配的空间量吗?或 v.begin() 在内存中的位置?

如果我真的只想删除所有元素,我会调用 clear() .但我想知道这个相关问题,因为有时我只需要删除 v 的前 X 个元素。 ,在这些情况下,我想保留 v.reserve(MY_SIZE) 分配的内存我不想要 v 的位置改变。

最佳答案

C++ 标准 (2003) 似乎隐含地保证如果调用 clear() 不会重新分配内存或 erase() std::vector 的方法.

根据Sequence(表67)的要求a.clear()相当于a.erase(begin(),end()) .

此外,标准规定 erase(...) std::vector<T> 的成员函数不会抛出异常,除非 T 的复制构造函数抛出异常(第 23.2.4.3 节)。因此它是隐式保证的,因为重新分配可能会导致异常(第 3.7.3、20.4.1.1 节)。

还有 v.begin()保持不变,如erase(...)只会使删除点之后的所有迭代器无效(第 23.2.4.3 节)。但是,它不会被取消引用(因为 v.begin() == v.end() )。

因此,如果您有一个符合标准的实现,您就没问题...

更正

我的推理是有缺陷的。我设法证明了 erase(...)不会重新分配,但如果您删除所有元素,实现仍然可以取消分配内存。但是,如果 a.capacity()在删除/清除之后报告“您可以添加 N 个元素而无需重新分配内存”。

C++11 标准定义了a.clear()不引用a.erase(...) . a.clear()不允许抛出异常。因此它可以解除分配,但不能重新分配。所以你应该在清除 vector 后检查容量以确保内存仍然存在并且下一次调整大小不会重新分配。

关于c++ - 删除 std::vector 的元素(并更改大小)而不影响分配的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17134908/

有关c++ - 删除 std::vector 的元素(并更改大小)而不影响分配的内存的更多相关文章

  1. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  2. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  3. ruby - 我可以使用 Ruby 从 CSV 中删除列吗? - 2

    查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html

  4. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  5. Ruby Koans about_array_assignment - 非平行与平行分配歧视 - 2

    通过ruby​​koans.com,我在about_array_assignment.rb中遇到了这两段代码你怎么知道第一个是非并行赋值,第二个是一个变量的并行赋值?在我看来,除了命名差异之外,代码几乎完全相同。4deftest_non_parallel_assignment5names=["John","Smith"]6assert_equal["John","Smith"],names7end45deftest_parallel_assignment_with_one_variable46first_name,=["John","Smith"]47assert_equal'John

  6. ruby - 我可以使用 aws-sdk-ruby 在 AWS S3 上使用事务性文件删除/上传吗? - 2

    我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的

  7. ruby-on-rails - Ruby 中的内存模型 - 2

    ruby如何管理内存。例如:如果我们在执行过程中采用C程序,则以下是内存模型。类似于这个ruby如何处理内存。C:__________________|||stack|||------------------||||------------------|||||Heap|||||__________________|||data|__________________|text|__________________Ruby:? 最佳答案 Ruby中没有“内存”这样的东西。Class#allocate分配一个对象并返回该对象。这就是程序

  8. ruby - 在 Ruby 中重新分配常量时抛出异常? - 2

    我早就知道Ruby中的“常量”(即大写的变量名)不是真正常量。与其他编程语言一样,对对象的引用是唯一存储在变量/常量中的东西。(侧边栏:Ruby确实具有“卡住”引用对象不被修改的功能,据我所知,许多其他语言都没有提供这种功能。)所以这是我的问题:当您将一个值重新分配给常量时,您会收到如下警告:>>FOO='bar'=>"bar">>FOO='baz'(irb):2:warning:alreadyinitializedconstantFOO=>"baz"有没有办法强制Ruby抛出异常而不是打印警告?很难弄清楚为什么有时会发生重新分配。 最佳答案

  9. ruby-on-rails - 添加回形针新样式不影响旧上传的图像 - 2

    我有带有Logo图像的公司模型has_attached_file:logo我用他们的Logo创建了许多公司。现在,我需要添加新样式has_attached_file:logo,:styles=>{:small=>"30x15>",:medium=>"155x85>"}我是否应该重新上传所有旧数据以重新生成新样式?我不这么认为……或者有什么rake任务可以重新生成样式吗? 最佳答案 参见Thumbnail-Generation.如果rake任务不适合你,你应该能够在控制台中使用一个片段来调用重新处理!关于相关公司

  10. ruby - 如何安全地删除文件? - 2

    在Ruby中是否有Gem或安全删除文件的方法?我想避免系统上可能不存在的外部程序。“安全删除”指的是覆盖文件内容。 最佳答案 如果您使用的是*nix,一个很好的方法是使用exec/open3/open4调用shred:`shred-fxuz#{filename}`http://www.gnu.org/s/coreutils/manual/html_node/shred-invocation.html检查这个类似的帖子:Writingafileshredderinpythonorruby?

随机推荐