假设我有一些集合,我在它的开头就获得了一个迭代器.现在让我们说我修改了这个集合.无论集合的类型还是迭代器,我还能安全地使用迭代器吗?
为避免混淆,这是我谈到的操作顺序:
在查看一些代码时,我发现了std :: set_difference的loopy和算法缓慢的实现:
for(int i = 0; i < a.size(); i++)
{
iter = std::find(b.begin(),b.end(),a[i]);
if(iter != b.end())
{
b.erase(iter);
}
}
Run Code Online (Sandbox Code Playgroud)
它可以很容易地用sort(向量没有排序)+ set_difference来替换,但这需要分配新的内存(参见我最近的Q 可以将输出的设置差异存储在第一个输入中吗?为什么它不能在"inplace"中完成).
所以我的解决方案是这样的:
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
}
}
Run Code Online (Sandbox Code Playgroud)
可以更优雅地完成吗?
优雅是主观的,所以在这个Q的范围内被定义为更清晰的代码(理想情况下来自STL算法,但我认为它无法完成),但没有内存分配,也没有增加alg复杂性.