相关疑难解决方法(0)

收集更改后,STL迭代器是否保证有效性?

假设我有一些集合,我在它的开头就获得了一个迭代器.现在让我们说我修改了这个集合.无论集合的类型还是迭代器,我还能安全地使用迭代器吗?

为避免混淆,这是我谈到的操作顺序:

  1. 获取集合的迭代器.
  2. 修改集合(显然不是其中的元素,而是集合本身).
  3. 使用在步骤1中获得的迭代器.根据STL标准,它是否有效?!

c++ containers iterator stl

30
推荐指数
2
解决办法
8440
查看次数

优雅的方法来删除另一个向量中包含的向量的所有元素?

在查看一些代码时,我发现了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复杂性.

c++ stl

11
推荐指数
2
解决办法
7324
查看次数

标签 统计

c++ ×2

stl ×2

containers ×1

iterator ×1