为什么std :: set :: erase与std :: set :: insert不一致?

时间:2018-06-22 13:17:28

标签: c++ algorithm set

为什么不从myset中减去第二组? myset.insert(second.begin(),second.end())可以正常工作。

// erasing from set
int main ()
{
  std::set<int> myset;
  std::set<int> second;
  std::set<int>::iterator it;

  // insert some values:
  for (int i=1; i<10; i++) myset.insert(i*10);  // 10 20 30 40 50 60 70 80 90
  for (int i=3; i<5; i++) second.insert(i*10); 

  myset.erase(second.begin(), second.end()); // Why is the second set not subtracted from myset?  myset.insert(second.begin(),second.end()) works as intended.

  std::cout << "myset contains:";
  for (it=myset.begin(); it!=myset.end(); ++it)
    std::cout << ' ' << *it;
  std::cout << '\n';

  return 0;
}

2 个答案:

答案 0 :(得分:3)

std::set::erase需要迭代器来调用它。将迭代器赋予另一个集合将不起作用。您想要的是std::set_difference,您将其传递给这两个集合,它将输出一个新集合,该集合包含第一个集合中所有元素的第二个集合中的所有元素。对你来说看起来像

std::set diff;
std::set_difference(myset.begin(), myset.end(), 
                    second.begin(), second.end(), 
                    std::inserter(diff, diff.begin()));

答案 1 :(得分:1)

erase将迭代器带入正在处理的集合中

 Removes the elements in the range [first; last), which must be a valid range in *this.

https://en.cppreference.com/w/cpp/container/set/erase