【发布时间】:2013-04-03 17:08:21
【问题描述】:
我正在查看一些遗留代码,并发现了一些可以改进的地方。
根据设计,向量具有指向类的指针,并且向量中的所有元素都是唯一的。
ReplaceVal 函数将向量中具有 old_value 的元素替换为 new_value,方式如下:
iterator i, i_e;
i = vector->begin();
i_e = vector->end ();
for (; i != i_e; ++i)
{
if ((*i) == old_child)
break;
}
// Insertion
vector->insert_call(new_child, i);
// Since, the pointers are invalidated, do another find for erase
i = vector->begin();
i_e = vector->end ();
for (; i != i_e; ++i)
{
if ((*i) == old_child)
break;
}
// Finally, erase the old_value
vector->erase_call(i);
因此,本质上,这涉及元素移动两次,每次插入和擦除,如果您要在矢量中间插入和擦除元素。
对于 n 次插入和删除调用,复杂度为 O(n*m),如果平均每次移动 m 个元素。
我认为,如果我使用std::replace,这可以改进,正如这里提到的@MSDN documentation 和std_replace_example。
std::replace 的复杂性是 O(n) old_value 和 new_value & 1 赋值操作的比较。很简单:
replace (vector.begin( ), vector.end( ), old_value , new_value);
如果我错了,请纠正我,并就我遗漏的任何内容分享反馈。
附:插入和擦除是自定义调用,它们还会更新给定元素的指向 left_sibling 和 right_sibling 的指针。
【问题讨论】: