2016-08-05 50 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