【发布时间】: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 缓存中)。