2013-06-18 115 views
1

我的代碼的基本結構是:更換項目++的std ::列表迭代器

using namespace std; 
void recursiveFunction(list <int> &jobs,...){ 
list<int>::iterator i; 
int ii; 
//code missing 
    for(i=jobs.begin(); i != jobs.end(); ++i){ 
     //more code missing 
     list<int>::iterator tempi(i); 
     ii=*i; 
     jobs.erase(tempi); 
     recursiveFunction(jobs,...); 
     jobs.insert(i,ii); 
    } 
} 

正如我發現,任何指針指向被擦除的位置是無效的,所以我失效。有沒有辦法以這種方式重新插入工作號碼?沒有創建新的列表每個遞歸的性能打擊?

有沒有辦法使用列表迭代器以外的東西,也許?

+3

究竟是你想做些什麼?在我看來,你嘗試擦除一個元素,然後將它插入到曾經是 –

+1

的地方。當使用'erase()'迭代時,你必須使用函數的返回值來進一步迭代。 – Mario

+0

在遞歸調用之後,迭代器i被腐蝕掉,所以爲什麼不使用push_back而不是insert? –

回答

3

list::erase返回一個迭代過去(最後)擦除元素的元素,並自list::insert將其迭代器傳遞給它的元素之前插入,總有一款適合您的需要:

using namespace std; 
void recursiveFunction(list <int> &jobs,...){ 
    //... 
    for(auto i = begin(jobs); i != end(jobs);){ 
    //... 
    auto tmpElem = *i; 
    i = jobs.erase(i); 
    recursiveFunction(jobs,...); 
    jobs.insert(i,tmpElem); 
    } 
} 

注:

  • i=jobs.erase(i)你有效地增加了i。因此請將增量放在for循環中。或者使用i=jobs.insert(i,tmpElem)後,所以i指向同一個元素再次
  • 聲明變量(例如itmpElem)地方,儘可能的良好作風和可維護性
  • 給變量的事情有意義的名字

根據功能的不同,可能有其他可能性來實現你想要的功能。通過這種方式,您可以在列表元素的每個子集上進行處理,並且在多次處理中進行處理。考慮名單有內容{1,2,3},繼承人什麼事情發生(在僞代碼):

recursiveFunction({1,2,3},...) 
    for-loop, i = &1 
    erase(1) 
    recursiveFunction({2,3},...) 
     for-loop, i = &2 
     erase(2) 
     recursiveFunction({3},...) //a 
     insert(2) 
     //... 
    insert(1) 
    for-looop, i = &2 
    erase(2) 
    recursiveFunction({1,3},...) 
     for-loop, i = &1 
     erase(1) 
     recursiveFunction({3},...) //b 
     insert(1) 
     //... 
    insert(2) 
    //... 

線A和B看起來是一樣的,雖然其他參數可能是不一樣的 - 我可以從你的代碼中看不出來。所以請記住它,並考慮這是否是你真正想要的。

+0

非常感謝!我應該說我正在用這個來列舉工作序列,並且如果一個工作序列是不合需要的,就會提前退出。 – DylanTheWebb

0

遞歸似乎不是您的問題的正確工具。如果你有一個包含{1,2,3,4}和所有三個資格名單,看起來這是會發生什麼:

 
recurse({1,2,3,4}); 
    it.1 = (1) 
    remove 1 
    recurse({2,3,4}); 
    it.2 = (2) 
    remove 2 
    recurse({3,4}); 
     it.3 = (3) 
     remove 3 
     recurse({4}); 
     it.4 = (4) 
     remove 4 
     recurse({}) 
     reinsert 4 ({4}) 
     reinsert 3 ({3,4}) 
     it.3 = (4) 
     remove 4 
     recurse({3}); 
     it.4 = (3) 
     remove 3 
     recurse({}) 
     reinsert 3 ({3}) 
     reinsert 4 ({3,4}) 
    reinsert 2 ({2,3,4}) 
    it.2 = (3) 
    remove 3 leaving ({2,4}) 
... etc ...