2015-05-18 8 views
0

У меня есть list из lists с элементами типа my_struct. Я просматриваю каждый элемент с двумя итераторами (один для внешнего списка и один для внутренних списков) и выполняет некоторые вычисления. Каждый раз, когда я передавал внутренний список, я проверяю критерий и (при необходимости) пытаюсь разбить этот внутренний список на два, используя функцию splice(). Я хочу переместить вторую часть внутреннего списка во внешний список (сразу после текущего внутреннего списка).Как реструктурировать список списков в C++ с использованием splice()

Вот что у меня до сих пор:

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

Когда я отлаживаю, я получаю 'error C2664', что второй параметр' listEntry' не может быть преобразован в 'std :: list <_Ty> &'. – jkl

ответ

1

Сначала я думаю, что вы пропустили то, что делает splice функция.

Проблема, которую я могу видеть, на первый взгляд, является то, что вы передаете итератор innerIter к spliceно, что итератор не указывает на главную страницу больше, так как вы увеличивается его в предыдущий цикл.

И главная проблема:

Вы 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'. Возможно, это была ошибка в моем мышлении. Я попытался использовать 5-й конструктор, предложенный в вашей ссылке. Я также пробовал вашу версию, но я получаю сообщение об ошибке 'C2784' говорит _" std :: move_iterator <_RanIt> std :: operator + (_ Diff, const std :: move_iterator <_RanIt> &) ": аргумент шаблона для" const std :: move_iterator <_RanIt> & "не может быть получен из" int "_ (я надеюсь, что я правильно его перевел). – jkl

+0

У меня уже было что-то подобное раньше, где я хотел добавить 'int' в' iterator'. Кстати: вместо того, чтобы передавать 'innerIter' в' splice', я хотел бы использовать что-то вроде 'idx = distance (listEntry.begin(), innerIter);' и добавить его, но вот где я получил ошибку раньше и поэтому начал переписывать все ... – jkl

+0

Я думаю, что ошибка была в операции '+' с интернатором, я отредактировал ответ. –