【发布时间】:2014-02-07 08:00:15
【问题描述】:
在查看一些代码时,我发现 std::set_difference 的实现循环和算法缓慢 :
for(int i = 0; i < a.size(); i++)
{
iter = std::find(b.begin(),b.end(),a[i]);
if(iter != b.end())
{
b.erase(iter);
}
}
它可以很容易地替换为排序(向量未排序)+ set_difference,但这需要分配新内存(请参阅我最近的 Q Can output of set difference be stored in first input? 为什么不能“就地”完成)。
所以我的解决方案是这样的:
sort(a.begin(), a.end());
for(size_t i = 0; i < b.size(); i++)
{
if (binary_search(a.begin(), a.end(), b[i]))
{
swap(b[i], b[b.size()-1]); //remove current element by swapping with last
b.pop_back(); // and removing new last by shrinking
}
}
可以做得更优雅吗?
优雅是主观的,所以在这个 Q 的范围内被定义为更清晰的代码(理想情况下来自 STL 算法,但我认为它不能完成)但没有内存分配,也没有增加算法复杂度。
【问题讨论】:
-
定义“优雅”。代码少?执行时间更短?内存少?
-
“看看我最近的 Q 21191631”——在哪里?
-
@JohnDibling 在最后一段中定义
-
@NoSenseEtAl:谢谢,错过了第一次通读。
-
@NoSenseEtAl 在第二个示例中,
b是set_difference的输入之一吗?如果是这样,您正在修改已传递给您的范围,调用者可能不会对此感到兴奋。当然,您可以制作本地副本,但现在该解决方案的吸引力开始下降。