2014-12-29 4 views
1

У меня есть ряд цифр, и я хочу положить его в кучи. То, как это делается, - это посмотреть на сваи (их всегда нужно заказывать по размеру), и если вы найдете кучу, в которой число меньше первого числа в этой куче, которое вы ставите перед кучей; если он больше последнего числа в куче, вы кладете его на заднюю часть кучи. Если ни одно из вышесказанного не верно, вы делаете новую кучу. Например:Поместите числа в разные сваи

Вход:

2 5 4 3 4 5 7 6 5 0 // 0 is used for end of input 

Выход:

3 4 5 7 
2 5 6 
4 5 

Программа компилируется и работает, но не так, как надо (разные результаты). Код ниже:

#include <iostream> 
#include <deque> 
#include <vector> 
using namespace std; 
    void sort_by_size(vector<deque<int>>& container) 
    { 
    for(int i=0;i<container.size();i++) 
     for(int j=i;j<container.size();j++) 
     if(container.at(i).size()<container.at(j).size()) 
      swap(container.at(i),container.at(j)); 
    } 
int main() 
{ 
    int n; 
    vector<int> all_dishes; 
    while(n!=0) 
    { 
    cin>>n; 
    if(n!=0) 
    all_dishes.push_back(n); 
    } 
    vector<deque<int>> piles ; 

    for(int i=0;i<all_dishes.size();i++) 
    { 
    sort_by_size(piles); 
    bool smaller = false; 
    bool greater = false; 
    for(int j=0;j<piles.size();j++) 
    { 
     if(all_dishes.at(i)<*piles.at(j).begin()) 
     { 
      piles.at(j).push_front(all_dishes.at(i)); 
      smaller = true; 
      break; 
     } 

     if(all_dishes.at(i)>*piles.at(j).end()) 
     { 
      piles.at(j).push_back(all_dishes.at(i)); 
      greater = true; 
      break; 
     } 

    } 

    if (smaller==false && greater==false) 
    { 
     deque<int> temp; 
     temp.push_back(all_dishes.at(i)); 
     piles.push_back(temp); 
    } 
    /*cout<<i<<":"<<endl; 
    for(int i=0;i<piles.size();i++) 
    { 
     for(int j=0;j<piles.at(i).size();j++) 
      { 
      cout<<piles.at(i).at(j)<<" "; 
      } 
    cout<<endl; 
    }*/ //for looking what happens at each iteration 
} 

    for(int i =0;i<piles.size();i++) 
    { 
     for(int j=0;j<piles.at(i).size();j++) 
     { 
     cout<<piles.at(i).at(j)<<" "; 
     } 
    cout<<endl; 
    } 
    return 0; 
} 

Любые идеи, в чем проблема с алгоритмом и как его исправить?

+3

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

+0

'sort_by_size' может использовать' std :: sort' (с пользовательским компаратором). – Jarod42

+0

@CaptainObvlious OK. – pesho

ответ

1

У вас есть несколько проблем.

Прежде всего, ваша переменная n не инициализируется. Это должно вызвать ошибку компилятора.

Во-вторых, вы пытаетесь разыменовать элемент из итератора end(). Это невозможно, потому что это указывает на тот, который находится за концом последовательности, поэтому end() не является различимым. Вы должны использовать back().

Другими словами, это

if(all_dishes.at(i)>*piles.at(j).end()) 

должен стать этим:

if(all_dishes.at(i) > piles.at(j).back()) 

С этими изменениями программа выдает ожидаемый результат.

+0

Я согласен, что разыменование итератора '.end()' является проблемой; вторая итерация данных должна иметь 5 добавленных после существующих 2, а не в новую кучу. Одного этого должно быть достаточно, чтобы ОП разработала типографию, чтобы определить, что происходит на земле. –

+0

Спасибо, что была проблема. Думаю, я должен быть более осторожным с 'begin' и' end' и вместо этого использовать 'front' и' back'. – pesho