我的排序功能出现问题

时间:2016-06-24 16:15:41

标签: arrays visual-studio sorting c++11 struct

首先,让我展示一下我的代码。

void findRev(Items* products[], int numOfProd) {

    for (int i = 0; i < (numOfProd - 1); i++) {
        double rev1 = products[i]->price * products[i]->numSold;
        double rev2 = products[i + 1]->price * products[i + 1]->numSold;

        if (rev1 > rev2) {
            Items* temp = products[i];
            Items* temp2 = products[i + 1];
            temp2 = products[i];
            temp = products[i + 1];
        }
    }
}

我有struct个不同的项目。我试图按收入对它们进行排序,但我必须先找到收入。

我知道我可以在我的结构中添加一个收入字段,但我的教授说我们不允许这样做。

我写了这个函数,但它没有按照我想要的方式工作。我之前使用了冒泡排序和选择排序。我似乎无法弄清楚如何使用其中一个用于此实例。我查看了所有书籍和在线资料。我的教授最好在排序循环中找到收入。我无法弄清楚如何。无论如何,我可以使它工作?

2 个答案:

答案 0 :(得分:1)

正确的排序方法是使用std::sort

通过投影进行排序时使用std::sort的正确方法是通过投影进行排序。

template<class F>
struct sort_by_t {
  F f;
  template<class Lhs, class Rhs>
  bool operator()(Lhs const& lhs, Rhs const& rhs) const {
    return f(lhs) < f(rhs);
  }
};
template<class F>
sort_by_t<typename std::decay<F>::type>
sort_by( F&& f ) { return {std::forward<F>(f)}; }

void findRef( Items const*const* products, int numOfProd) {
  std::sort( products, products+numOfProd,
    sortby([](Items const* i) { return i->price * i->numSold; })
  );
}

您的代码甚至排序,更不用说合理地执行了。

上面的代码有效而简洁地对数组进行排序。 sort_by代码是样板文件,可以在别处重复使用。

以下是{C} 11后的sort_t - 少sort_by

template<class F>
auto sort_by(F&& f) {
  return [f=std::forward<F>(f)](auto&& lhs, auto&& rhs){
    return f(lhs)<f(rhs);
  };
}

答案 1 :(得分:0)

您可以先使用数组存储收入,然后根据该数组对产品进行排序,如下所示:

void findRev(Items* products[], int numOfProd) {
    double* rev= new double[numOfProd];
    for (int i = 0; i < numOfProd; i++)
        rev[i] = products[i]->price * products[i]->numSold;

    // bubble sort
    Items *tempItem;
    double tempDouble;
    for(int i=0; i< numOfProd; i++)
      for(int j=0; j< numOfProd - i -1; j++)
         if(rev[j] > rev[j+1]){
           tempDouble = rev[j];
           rev[j] = rev[j+1];
           rev[j+1] = tempDouble;
           tempItem = products[j];
           products[j] = products[j+1];
           products[j+1] = tempItem;
          }

      delete[] rev;
 }