考虑以下函数从线性运行时间中删除数组中的重复项
//! Removes duplicated integers
void remove_duplicate(
vector<unsigned>&arr, //!< [in,out] Remove duplicates from this array
vector<bool>&seen //!< [???] All elements must be false and have at least as many elements as one plus the maximum number in \p max_int. After the function call finishes all elements are false.
)noexcept{
{
auto in=arr.begin(), out=arr.begin(), end = arr.end();
while(in != end){
if(!seen[*in]){
*out = *in;
++out;
seen[*in] = true;
}
++in;
}
arr.erase(out, end);
}
{
for(auto i=arr.begin(), end = arr.end(); i!=end; ++i)
seen[*i] = false;
}
}
出于效率和异常安全原因,存在seen
参数。可以将其作为函数内的自动变量,而不是将其作为参数传递。但是,这种内存分配可能会抛出。此外,如果经常在类似的数组上调用removed_duplicate
,例如来自已知范围的ID数组,那么为每个工作线程分配seen
向量,然后不断重复使用它是个好主意。 。
我可以用Doxygen将参数标记为“in”,“out”或“in,out”。 arr
显然是一个“in,out”参数。 seen
参数既不适合这两个类别。我该放什么?