gpt4 book ai didi

c++ - "backup"(复制)自定义对象的大型 STL vector 的快速方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:58:46 24 4
gpt4 key购买 nike

我正在使用 STL vector 存储大量(~ 10^6)自定义对象(sizeof() 为其中一个对象提供 368 字节)。我的程序结构要求我经常备份此 vector 的拷贝,因为在特定步骤中所做的更改可能需要在特定条件下展开。大致这看起来像

std::vector<myClass> vecA( largeNumber );
std::vector<myClass> vecB;

do
{
vecB = vecA;

//do lots of stuff to vecA

if ( restoreBackup ) { vecA = vecB; }

} while (someCondition)

做一些分析,复制操作 vecB = vecA 实际上是一个相当大的瓶颈。我真的需要加快这部分的速度。你会建议哪些策略?

备注:

  • 出于某些原因,我想保留 STL vector 结构。
  • 我知道大多数时候只有 vecA 中的一小部分元素得到更新。所以我可以尝试维护这些元素的额外列表,然后仅通过遍历此列表来回复制这些元素。这是一个合适的策略吗?
  • 这个问题肯定与this question有关,但是那里提出的解决方案并没有真正帮助。

最佳答案

嗯,这不是一件小事,我不认为你可以避免这种复制,如果你真的只需要使用(和一个)std::vector .

最好的解决方案是使用 Persistant Data Structure .

但是如果您需要存储多个版本的容器,这将非常有用。

如果你只需要以前的版本..
我想到的最简单的事情似乎对您有用,就是备份元素,您将进行更改。你可以使用 std::list (或 std::vector )与 std::pair< int, myClass > .所以,first这对将是元素的索引,您正在更改并且 second - 备份版本。所以,最后,如果你需要恢复备份,你只需通过这个容器并“恢复”旧数据。

删除/添加元素的情况会比较复杂,但不是无解。您将需要更多的容器——一个用于删除的元素,一个用于添加的元素,一个用于更改的元素,一个用于更改的顺序。因此,这将为您提供执行“撤消”步骤的机会。

嗯,这听起来更复杂并且有点难以实现(因为所有可能的情况),但会提高性能(会减少拷贝)。

另一件事,我想到了 - 您可以先检查容器大小。如果它很小,请制作完整拷贝。如果它很大 - 执行“选择性备份”或任何所谓的备份。

请注意,这不是最好的解决方案(我猜),而只是一个想法,我现在得到了(我从来不需要这样的东西)

希望对您有所帮助,尽管这听起来很复杂且难以实现。

关于c++ - "backup"(复制)自定义对象的大型 STL vector 的快速方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5727968/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com