【问题标题】:Shifting array elements to the right with a C++ equivalent of memmove使用等同于 memmove 的 C++ 将数组元素向右移动
【发布时间】:2016-02-11 21:24:33
【问题描述】:

出于学习目的,我正在创建一个容器,该容器基于具有类似地图功能的数组。每次我插入一个键时,我都想保持数组有序。我已经实现了查找键应该在数组索引中的位置的函数,我目前唯一的问题是有效地移动数组元素。

我有一个简单的循环来做到这一点:

for (size_t i = mSize; i > n; i--)
{
    mCont[i] = mCont[i - 1];
}

但是,当容器变大时,我可能会使用诸如 memmove 之类的东西来更快地执行此操作 - 但我不确定如何使用它。

感谢您的宝贵时间。

【问题讨论】:

  • 为了更快,你应该使用移动语义
  • memmove 是一个 C 函数。因此仅对 POD 类型有用。你应该使用std::copy()(或者如果你移动语义std::move),它将对被移动的类型使用最有效的方法(即,如果最有效的方法是memmove,它将使用它)。
  • 这就是为什么 memmove 不能与非 POD 类型一起使用的原因:stackoverflow.com/questions/12135769/…
  • @LokiAstari:因为他在右边抄袭,我认为std::copy_backward 更有意义。
  • 仅仅因为它有一个标准功能并不意味着它会更加更有效率。插入位置右侧的所有内存都必须被读取和重写,无论您做什么都将花费O(n) 时间。降低常数因子会有所帮助,但对于非常大的n,它仍然不会使这样的容器可用(与树相比)。但是,您是对的,如果 mCont 是一个字节数组,编译器可能会发出一次操作一个字节的代码,在这种情况下,memmove 可能会以约 16 倍甚至约 32 倍击败它一个 x86 CPU(如果它在 L1 缓存中)。

标签: c++ arrays


【解决方案1】:

你可以使用std::move_backward

std::move_backward( std::next( std::begin( mCont ), n ), 
                    std::next( std::begin( mCont ), mSize - 1 ),
                    std::next( std::begin( mCont ), mSize ) );

【讨论】:

  • 不错。我什至不知道这是一个标准算法。
  • 感谢您的意见
猜你喜欢
  • 2022-01-05
  • 1970-01-01
  • 2019-07-19
  • 1970-01-01
  • 2018-06-07
  • 1970-01-01
  • 1970-01-01
  • 2016-09-01
  • 2021-12-27
相关资源
最近更新 更多