2016-08-05 52 views
1

我试图实现使用SET返回一组集合的所有子集的问题。我的代码如下:从设置使用值或iteraor擦除元素

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)擦除值时,我得到所需的集合。但如果我使用(它)通过有效的迭代器位置擦除。我没有得到期望的结果。 请帮我理解发生了什么。

回答

3
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