【问题标题】:Optimizing the usage of std::vector with other vectors优化 std::vector 与其他向量的使用
【发布时间】:2021-03-27 00:34:47
【问题描述】:

我想知道将一个向量设置为等于另一个向量并在第一个向量更改后释放内存的最有效方法是什么。我无法想象将一个向量调整为另一个向量的大小并对其进行迭代并设置每个索引是最有效的方法,

std::vector< int > a, b;
//Stuff happens

//Swap
b.resize(a.size());
for (int i=0; i < a.size(); i++){
    b[i] = a[i];
}

a.clear();

我想像memset 这样的东西会更有效率,或者emplace_back 当你在不复制或构造东西的情况下推入元素时,但我不知道哪个更有效或如何使用它与std::vector's。还有a = b,但那在幕后做什么?它是在复制它,而不是仅仅将现有向量a 的内存设置为b?实现这一目标的最有效方法是什么?

【问题讨论】:

    标签: c++ optimization vector


    【解决方案1】:

    我想知道将一个向量设置为等于另一个向量并在其更改后释放第一个向量中的内存的最有效方法。

    只需移动一个vector 到另一个vector 的现有内存的所有权被转移,同时也释放目标vector 的现有内存。

    b = std::move(a);
    

    虽然从技术上讲,允许移动分配 operator= 只是交换两个 vectors 周围的记忆,这样 b 的记忆在 @ 之前不会被释放987654328@ 稍后会被销毁。这是否实际发生取决于实现。如果你不想依赖它,你可以这样做:

    b = vector<int>(std::move(a));
    

    这将移动构造一个临时的vector,它拥有a的内存所有权,然后将该内存移动分配到b,并且如果b::operator=碰巧交换内存,然后b 的旧内存将在临时vector 被销毁时释放,而不是在a 被销毁时释放。

    还有a = b,但那在幕后做什么?是复制它,而不是仅仅将现有向量a的内存设置到b中?

    复制a 的数据到b,留下a 原样。类似于您提出的resize+iteration 循环(但更有效)。

    【讨论】:

      【解决方案2】:

      std::vector 有一个复制赋值运算符,这意味着您可以将所有vector 的值分配给另一个vector。这意味着:

      b.resize(a.size());
      for (int i = 0; i < a.size(); ++i) {
          b[i] = a[i];
      }
      a.clear()
      

      等同于:

      b = a;
      a.clear()
      

      是的!这很简单!

      希望这对您有所帮助!

      【讨论】:

      • 这段代码使用vector的复制赋值操作符,而不是它的复制构造函数
      • 谢谢!我忘了;)
      猜你喜欢
      • 2016-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-12
      • 1970-01-01
      • 2013-03-13
      • 2023-03-07
      • 1970-01-01
      相关资源
      最近更新 更多