Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Проблема с STL, не работает алгоритм sort


Автор: Zerony 15.12.2011, 20:24
Всем привет, следующая задача. 

Есть колода карт. Карту я реализовал как класс с двумя полями (масть, ранг). Создать колоду на 36 карт (успешно), перемешать ее (успешно), потом записать их в стек (успешно), после чего взять шесть карт и записать в список (успех), а потом отсортировать список (вот и сам вопрос). 

В общем, сам класс я сделал так: 
Код

class tCard // Class of cards
{
public:
    int Suit; 
    int Rang; 
    tCard (int tSuit = 1, int tRang = 1) // Constructor 
    {
        Suit = tSuit; 
        Rang = tRang;
    }
    friend std::ostream &operator<<(std::ostream &output, tCard &P) {
        string s[] ={"Крест", "Пика", "Черва", "Бубна"} ;
        string sRang[] = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "Валет", "Дама", "Король", "Туз"};
        output<<setw(5)<<s[P.Suit]<<setw(11)<<sRang[P.Rang]<<endl; 
        return output;};
};


Перегрузил операторы сравнения 
Код

    bool operator> (tCard a1, tCard a2)
    {
        if (a1.Suit>a2.Suit)
        {
        return true;
        }
        else return a1.Rang>a2.Rang; };

    bool operator< (tCard a1, tCard a2)
    {
        if (a1.Suit<a2.Suit)
        {
        return true;
        }
        else return a1.Rang<a2.Rang; 
    };
    bool operator== (tCard a1, tCard a2)
    {
        if ((a1.Suit==a2.Suit) &&(a1.Rang==a2.Rang))
        {
        return true;
        }
        else return false ;
    }


Вот место, где выдает ошибку. Ошибку выдает уже на самом этапе выполнения программы
Код

for (int i=0; i<6; i++) // Тут я 6 карт достаю из колоды и в список
    {
        l1.push_back(stDeckCards.top());
        stDeckCards.pop();
    }
    // Выводим на экран
    cout<<"Верхние 6 карт\n";
    list<tCard>::iterator p=l1.begin();
    for (int i=0; i<6; i++)
    {
        cout<<*p; 
        p++;
    }
     // Вот тут все попытки отсортировать его завершались неудачей. 
    cout<<"Сортировка списка\n";
    list<tCard>::iterator p2 = l1.end();    
    p = l1.begin();
    l1.sort(); //Не работает, так же как и если взять просто алгоритм и написать sort (p, p2), только в случае с алгоритмом ошибка на этапе компиляции
    for (int i=0; i<6; i++)
    {
        cout<<*p; 
        p++;
    }


А сама ошибка: 

Автор: mes 15.12.2011, 20:44
Цитата(Zerony @  15.12.2011,  19:24 Найти цитируемый пост)
        if (a1.Suit<a2.Suit)
        {
        return true;
        }
        else return a1.Rang<a2.Rang; 


с такой логикой сравнения у Вас может быть одновременно правый меньше левого и левый меньше правого smile

Автор: Zerony 15.12.2011, 21:09
Цитата(mes @ 15.12.2011,  20:44)
Цитата(Zerony @  15.12.2011,  19:24 Найти цитируемый пост)
        if (a1.Suit<a2.Suit)
        {
        return true;
        }
        else return a1.Rang<a2.Rang; 


с такой логикой сравнения у Вас может быть одновременно правый меньше левого и левый меньше правого smile

И как вы так быстро уловили? 

Огромное спасибо, вопрос закрыт. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)