2015-05-18 28 views
0

我有listlists,其元素類型爲my_struct。我用兩個迭代器(一個用於外部列表,一個用於內部列表)遍歷每個元素並進行一些計算。每次我通過一個內部列表時,我都會檢查一個標準,並且(如有必要)嘗試使用splice()函數將此內部列表分成兩部分。我想將內部列表的第二部分重新定位到外部列表(緊跟當前內部列表之後)。如何使用拼接在C++中重構列表清單()

這裏是我到目前爲止有:

std::list<std::list<my_struct>> myList; 
std::list<std::list<my_struct>>::iterator outerIter; 
std::list<my_struct>::iterator innerIter; 

for (outerIter = myList.begin(); outerIter != myList.end(); outerIter++) 
{ 
    std::list<my_struct> &listEntry = *outerIter; 

    for (innerIter = listEntry.begin(); innerIter != listEntry.end(); innerIter++) 
    { 
     // some calculations 
    } 

    if (criterion) 
    { 
     myList.splice(outerIter, listEntry, innerIter, listEntry.end()); 
    } 
} 

這段代碼應該做的是重新定位std::list<my_struct>開始在innerIter和結束在listEntry.end()作爲一種新的內部列表僅落後於當前檢查內部列表。

我希望你能理解我的意思,因爲我不知道該怎麼解釋,這更容易理解。

我已經嘗試過編寫splice部分的不同方式,但我總是收到錯誤。

所以,如果有人有一個關於如何正確編程的想法,那麼我會很樂意得到一些幫助。

+0

有什麼問題嗎? – Barry

+0

問題是如何使用'splice()'函數寫入正確的行。 – jkl

+0

當我調試時,我得到'錯誤C2664'說第二個參數'listEntry'不能轉換爲'std :: list <_Ty>&'。 – jkl

回答

1

首先,我想你已經錯過了splice函數所做的一切。

我第一眼看到的問題是,你傳遞的迭代器innerItersplice是迭代器沒有指向的遊戲內任何更多,因爲你在前面增加它的循環。

和主要問題:

您trasfering my_struct類型的元素添加到列表std::list<std::list<my_struct>>。因此,你得到的編譯錯誤:你不能將my_struct轉換爲std::list<my_struct>,如果你搜索詳細的錯誤,你會發現_Ty確實是my_struct

所以,這是你必須做的事情:

  1. 創建新的列表,將reveice的元素。
  2. 傳遞元素。
  3. 在你想要的位置插入新的列表。

在C++(警告未測試):

for (auto outerIter = myList.begin(); outerIter != myList.end(); outerIter++) 
{ 
    std::list<my_struct> &listEntry = *outerIter; 

    for (auto innerIter = listEntry.begin(); innerIter != listEntry.end(); innerIter++) 
    { 
     // some calculations 
    } 

    if (criterion) 
    { 
     // you need point the next element, in roder to insert after the current outerIter position. 
     MyList::iterator tmp = outerIter; 
     std::list<my_struct> list_to_insert;               // 1 
     list_to_insert.splice(list_to_insert.begin(), listEntry, listEntry.begin(), listEntry.end()); // 2 
     myList.insert(++tmp, list_to_insert);             // 3 
    } 
} 
+0

當我將'listEntry'聲明爲'std :: list &listEntry = * outerIter;'時,我認爲它的類型是'std :: list &'而不是'my_struct'類型。也許這是我思考中的錯誤。 我試圖使用鏈接中提出的第五個構造函數。我也試過你的版本,但是我得到一個錯誤'C2784'說__ std :: move_iterator <_RanIt> std :: operator +(_ Diff,const std :: move_iterator <_RanIt>&)「:模板參數爲」const std :: move_iterator <_RanIt>&「不能從」int「派生(我希望我能正確翻譯它)。 – jkl

+0

我之前已經有過類似的東西,我想在'iterator'中添加一個'int'。 順便說一句:代替將'innerIter'傳遞給'splice',我想使用'idx = distance(listEntry.begin(),innerIter)';'並添加它,但這是我之前得到錯誤的地方,因此開始重寫所有內容... – jkl

+0

我認爲錯誤發生在interator的'+'操作中,我編輯了答案。 –