使用value或iteraor从集合中擦除元素

Erasing element from a Set using value or iteraor

本文关键字:擦除 元素 集合 value iteraor 使用      更新时间:2023-10-16

我试图实现使用set返回集合的所有子集的问题。我的代码如下:

set< set<int> > getallsets(set<int> iset){
    std::set< set<int> > sets;
    std::set<int> nullset;
    sets.insert(nullset);
    if(iset.size() <= 0)
        return sets;
    if(iset.size() ==1){
        sets.insert(iset);
        return sets;
    }
    std::set<int>::iterator it = iset.begin();
    set<int> niset = iset;
    ////////////////////////////
    niset.erase(*it);   // niset.erase(it); // Issue
    ///////////////////////////
    sets  = getallsets(niset);
    std::set< set<int> >::iterator i;
    std::set<int>::iterator j;
    for(i = sets.begin();i !=sets.end();i++){
        std::set<int> temp = *i;
        temp.insert(*it);
        sets.insert(temp);
    }
    return sets;
}

问题在突出显示的部分。当我使用(*it)按值擦除时,我得到了所需的集合。但如果我使用(它)通过迭代器位置擦除,这是有效的。我没有得到想要的结果。请帮我了解发生了什么。

std::set<int>::iterator it = iset.begin();

it是属于iset的迭代器(不是指针!)。尝试将其与niset一起使用是未定义的行为。

你可以通过以下操作获得你想要的行为:

set<int> niset = iset;
std::set<int>::iterator it = niset.begin();
niset.erase(it); // Issue