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



为什么第二组没有从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;
}

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()));

擦除将迭代器带入它正在处理的集合中

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

最新更新