2016-04-16 2 views
-3

В приведенном ниже коде в функции void printExpensiveThanT (..) я должен распечатать место назначения, расстояние и цену для предложений, которые стоят дороже, чем предложите функцию T в функции, отсортированную по возрастанию по значению расстояния. Я не уверен, что я должен использовать для сортировки, я экспериментировал с векторами, но это не сработало, поэтому я удалил его. Любая помощь будет оценена по достоинству.[C++] Сортировка объектов по значению члена класса

#include <iostream> 
#include <cstring> 
#include <algorithm> 
using namespace std; 
class Transport { 
protected: 
    char destination[100]; 
    int basePrice; 
    int distance; 
public: 
    Transport() {} 
    Transport(char *destination, int basePrice, int distance) { 
     strcpy(this->destination, destination); 
     this->basePrice = basePrice; 
     this->distance = distance; 
    } 
    virtual ~Transport() {} 
    virtual int priceTransport() = 0; 
    friend bool operator<(const Transport &t1, const Transport &t2) { 
     return t1.distance<t2.distance; 
    } 
    int getDistance(){ return distance; } 
    char *getDestination() { return destination; } 
    int getPrice() { return basePrice; } 
}; 
class AutomobileTransport : public Transport { 
private: 
    bool ifDriver; 
public: 
    AutomobileTransport() {} 
    AutomobileTransport(char *destination, int basePrice,int distance, bool ifDriver) : Transport(destination,basePrice,distance) { 
     this->ifDriver = ifDriver; 
    } 
    void setIfDriver(bool ifDriver) { 
     this->ifDriver = ifDriver; 
    } 
    bool getIfDriver() { 
     return ifDriver; 
    } 
    int priceTransport() { 
     if(ifDriver) { 
      basePrice+=basePrice*20/100; 
     } 
     return basePrice; 
    } 
    friend bool operator<(const AutomobileTransport &a1, const AutomobileTransport &a2) { 
     return a1.distance<a2.distance; 
    } 
}; 
class VanTransport: public Transport { 
private: 
    int passengers; 
public: 
    VanTransport() {} 
    VanTransport(char *destination, int basePrice, int distance, int passengers) : Transport(destination, basePrice, distance) { 
     this->passengers = passengers; 
    } 
    void setPassengers(int passengers) { 
     this->passengers = passengers; 
    } 
    int getPassengers() { 
     return passengers; 
    } 
    int priceTransport() { 
     for(int i = 0; i < passengers; i++) { 
      basePrice-=200; 
     } 
     return basePrice; 
    } 
    friend bool operator<(const VanTransport &k1, const VanTransport &k2) { 
     return k1.distance<k2.distance; 
    } 
}; 
void printExpensiveThanT(Transport **offers,int n,AutomobileTransport &T) { 
    Transport *tmp; 
    for(int i = 0; i <= n; i++){ 
     if(offers[i]->priceTransport() > T.priceTransport()) 
      cout<<offers[i]->getDestination()<<" "<<offers[i]->getDistance()<<" "<<offers[i]->getPrice()<<endl;  
     }  
} 
int main() { 
    char destination[20]; 
    int type,price,distance,passengers; 
    bool driver; 
    int n; 
    cin>>n; 
    Transport **offers; 
    offers=new Transport *[n]; 
    for (int i=0; i<n; i++) { 
     cin>>type>>destination>>price>>distance; 
     if (type==1) { 
      cin>>driver; 
      offers[i]=new AutomobileTransport(destination,price,distance,driver); 
     } else { 
      cin>>passengers; 
      offers[i]=new VanTransport(destination,price,distance,passengers); 
     } 
    } 
    AutomobileTransport at("Ohrid",2000,600,false); 
    printExpensiveThanT(offers,n,at); 
    for (int i=0; i<n; i++) delete offers[i]; 
    delete [] offers; 
    return 0; 
} 
+2

* я экспериментировал что-то с векторами, но это не сработало, так что я удалил это * - И я уверен, что код, который вы оставили, намного более глючен и длиннее, чем если бы вы действительно использовали вектор правильно. – PaulMcKenzie

+0

Знаете ли вы, что такое http://sscce.org/? Извините, но я понятия не имею, как найти часть вашего вопроса в вашем полном коде. Поэтому, пожалуйста, подготовьте * короткий * пример, который содержит вашу проблему! – Klaus

ответ

1

Так как вы имеете дело с указателями, проще всего сделать, это использовать std::vector и std::sort:

#include <vector> 
//... 
void printExpensiveThanT(Transport **offers, int n, AutomobileTransport &T) 
{ 
    std::vector<Transport*> sortedVect; 
    for (int i = 0; i < n; i++) 
    { 
     if (offers[i]->priceTransport() > T.priceTransport()) 
      sortedVect.push_back(offers[i]); // add this item to the vector 
    } 

    // sort the vector based on the dereferenced pointers and their respective 
    // operator < 
    std::sort(sortedVect.begin(), sortedVect.end(), 
    [](Transport* left, Transport* right) { return *left < *right; }); 

    // print out the values 
    for (auto it : sortedVect) 
     cout << (*it).getDestination() << " " << (*it).getDistance() << " " << (*it).getPrice() << "\n"; 
} 

Кроме того, исходный код петельные больше, чем должен (i <= n был неправ) один ,

Edit:

Если ваш компилятор не поддерживает синтаксис в C++ 11, здесь альтернативное решение:

#include <vector> 
//... 
bool Sorter(Transport* left, Transport* right) 
{ return *left < *right; } 

void printExpensiveThanT(Transport **offers, int n, AutomobileTransport &T) 
{ 
    std::vector<Transport*> sortedVect; 
    for (int i = 0; i < n; i++) 
    { 
     if (offers[i]->priceTransport() > T.priceTransport()) 
      sortedVect.push_back(offers[i]); // add this item to the vector 
    } 

    // sort the vector based on the dereferenced pointers and their respective 
    // operator < 
    std::sort(sortedVect.begin(), sortedVect.end(), Sorter); 

    // print out the values 
    std::vector<Transport*>::iterator it = sortedVect.begin(); 
    while (it != sortedVect.end()) 
    { 
     cout << (*it).getDestination() << " " << (*it).getDistance() << " " << (*it).getPrice() << "\n"; 
     ++it; 
    } 
} 
+0

Спасибо за ответ. Хотя, компилятор, над которым я работаю, не распознает цикл 'for (auto it: sortedVect), возможно ли с помощью обычного цикла' for'? И если да, как это будет выглядеть. Запрашивая эту проблему, я не знаком с библиотекой . Также в '[] (Транспорт * слева, Транспорт * справа) {return * left <* right; }); ', он ожидает выражение в []. Спасибо заранее –

+1

Я отредактировал ответ с версией не C++ 11. Однако вам следует серьезно подумать об обновлении вашего компилятора для поддержки синтаксиса C++ 11. – PaulMcKenzie

Смежные вопросы