首先,让我展示一下我的代码。
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
个不同的项目。我试图按收入对它们进行排序,但我必须先找到收入。
我知道我可以在我的结构中添加一个收入字段,但我的教授说我们不允许这样做。
我写了这个函数,但它没有按照我想要的方式工作。我之前使用了冒泡排序和选择排序。我似乎无法弄清楚如何使用其中一个用于此实例。我查看了所有书籍和在线资料。我的教授最好在排序循环中找到收入。我无法弄清楚如何。无论如何,我可以使它工作?
答案 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;
}