-2
class Medicine{
protected:
    int id;
    int stock;
    string name;
    int concentration;
public:
    Medicine(); 
    Medicine(int id,int s,const string n,int c);        
    Medicine(const Medicine& m);                
    Medicine& operator=(const Medicine& m);     
    virtual ~Medicine();    
        int getStock() const;   
    int getConcentration() const;}; 

模块 1

    template<typename T> class Vector
    {
    private:
        T* Elems;
        int Size;
        int Capacity;

    public:
        Vector()
    ~Vector()
    void add(T e)
    void remove(int pos)
    int getSize() const
    int getCapacity() const
    T get(int pos) const;}

template <typename T>
    T Vector<T>::get(int pos) const
    {
        if (pos < 0 || pos >= this->getSize())
            return NULL;
        return this->Elems[pos];
    }

模块 2

class MedRepo :
public:~MedRepo();
 void addMed(Medicine s);
     void upgrade(Medicine s);
Medicine* findById(int medId) ;
virtual void removeMed(int id) ;
int getNrMeds();
Vector<Medicine*> getAll() ;
protected:
    Vector<Medicine*> MedList;
};

模块 3

typedef int (*comparefunction)(const void*, const void*);

int compareSA(const Medicine* e1, const Medicine* e2){
    int q1 = (*(Medicine **) e1)->getStock();
    int q2 = (*(Medicine **) e2)->getStock();

    if (q1 < q2){
             return -1;
         }
    else{
        if (q1>q2){
            return 1;
        }
        return 0;
    }
}

模块 4

所以,这是我的代码的一部分,我想做的是根据一些标准对我的对象进行排序,其中一个是第 4 个模块中的那个。我从本周开始一直在学习课程,我'发现了一些类似的问题,但我不了解排序的整个过程。我刚刚阅读了一些内容std:sortstd::stable_sort但我不知道如何将它们用于我的数据。我现在所拥有的是:

Vector<Medicine*>* Control::sortByStockAsc(){
    Vector<Medicine*> all =repo->getAll();

任何想法,建议,帮助?

4

2 回答 2

3

第一:扔掉你自己的vector类(通过查看成员的类型,它有明显的错误)。使用std::vector<T>.

如果你真的想继续使用它想使用它std::sort,你将需要为它实现迭代器。鉴于您刚刚开始使用 C++,这可能是一个真正的挑战(有很多文章、整个帮助程序库和专门针对它的书籍章节)。

如果您不想使用std::sort并想保留自己的 Vector,请为您的容器实现排序算法。

理想情况:operator<(const Medicine&, const Medicine&)将医学实现为严格的弱排序关系,并像这样使用它:

#include <vector>
#include <algorithm>

std::vector<Medicine> mv;
std::sort(begin(mv), end(mv));

如果有更多的可能性来比较医学,实现函子或自由函数:

struct LessCmpMedicineByName {
  bool operator()(const Medicine&, const Medicine&) const;
};
struct LessCmpMedicineById {
  bool operator()(const Medicine&, const Medicine&) const;
};

// use
std::sort(begin(mv), end(mv), LessCmpMedicineByName());
// or with a lambda
std::sort(begin(mv), end(mv), [](const Medicine& x, const Medicine& y) {
  // comparison code here
  return true;
});
于 2013-05-11T19:27:21.797 回答
0

不要扔掉向量。制作自己的容器有很多优点。您必须仔细定义排序标准,任何排序算法才能正常工作。

任何排序操作只需要一个 > 操作符来工作你的条件必须具有以下属性:

for any a b and c, if a > b and b > c then it must be that a > c

for any a, a > a must be false.

平等定义为:

(!(a > b ) && !( b > a ))

相等条件可以(并且应该)编码到您的排序算法中。您无需为排序标准专门定义相等运算符。

如果输入相等,则不需要常规排序算法来保留输入的顺序。在稳定的排序算法中,输入中相等的任何输入必须在输出中以相同的相对顺序发出。例如,如果您仅按数字对扑克牌进行排序并且您的输入是 5h 4d 5s,那么稳定排序的输出必须是 4d 5h 5s。对于不稳定的排序,它可以输出 4d 5s 5h。

稳定排序有点慢。您通常不需要稳定的排序。

于 2013-05-11T19:40:36.293 回答