例如,我在C ++中有一个动态数组,类似于std::vector
。在实施erase
功能时,这是最好的前进方式,还是有更好的方式更快/更有效?
void erase(iterator it)
{
my_array<template_argument> x;
for(iterator i = begin(); i != end(); ++i)
{
if(i == it)
{
continue;
}
x.push(*i);
}
*this = x;
}
答案 0 :(得分:4)
您可以执行就地删除,而不是制作几乎整个数组的新副本。
for(iterator i = it; i+1 != end(); ++i)
{
*i = *(i+1); // or std::iter_swap(i, i+1); if swapping is more efficient
}
pop();
答案 1 :(得分:0)
这实际上取决于您的要求。如上所述,一般情况下,您将使用std::iter_swap
在要删除的元素之前(或之后)移动所有元素。
例如,如果您查看std::deque
,它可以保证最多N/2
个元素通过选择是否在之前或之后移位这些元素来移动,具体取决于要删除的元素是否更接近于头或尾巴。