1

假设我有一个看起来像这样的类:

Class Items{
   private:
   float price;
   string name;
   float qunatity;
   public:
   getname(string nam){name=nam;}}

ETC...

我有一个由此类项目组成的向量,然后我将如何根据用户输入对向量进行排序,例如如果用户想按名称对项目进行排序,那么它将按名称等进行排序。

编辑:: 好的,所以我有一个类项目,也有一个类库存:

Class Inventory{
      print();
      getdata();
      sort();
      static bool SORT_BY_NAME(const Item& i, const Item &j)}

然后我有一个 Sang Geo 为比较而编写的函数

static bool Inventory::SORT_BY_NAME(const Item & i, const Item & j) {                                                                                                                                                                                                       
  return i.name.compare(j.name) < 0;
}

然后我还有一个排序函数,它将使用不同的布尔排序函数

void Inventory::sorting(){
  int x;
  cout<<"How do you want to sort it: 1.name 2.ID 3.month";
  cin>>x;
  // vector<Item>::iterator it;                                                                                                   
  switch(x){
  case 1:
    std::sort(items.begin(), items.end(), Inventory::SORT_BY_NAME);
  }

但它说 Items::name 是私有的

4

4 回答 4

2

您只需为要排序的每个字段编写一个比较函数,然后根据用户输入选择正确的字段。

排序

于 2012-11-11T20:20:34.357 回答
2

为了更好地说明如何在std::sort您的场景中使用,这里有一个完整的示例,其中为您的类中的三个字段定义了三个比较函数:

#include <algorithm>
#include <vector>
#include <iostream>
#include <sstream>
#include <string>

class Item{
    public:
        float price;
        std::string name;
        float quantity;
        static bool SORT_BY_NAME(const Item & i, const Item & j) {
            return i.name.compare(j.name) < 0;
        }
        static bool SORT_BY_PRICE(const Item & i, const Item & j) {
            return i.price < j.price;
        }
        static bool SORT_BY_QUANTITY(const Item & i, const Item & j) {
            return i.quantity < j.quantity;
        }
        std::string ToString(){
            std::stringstream ss;
            ss << name << ": $" << price << "; " << quantity;
            return ss.str();
        }
};

int main(int argc, char ** argv) {
    std::vector<Item> items;
    Item item1, item2, item3;

    item1.name = "Name1";
    item1.price = 2;
    item1.quantity = 3;

    item2.name = "Name2";
    item2.price = 3;
    item2.quantity = 1;

    item3.name = "Name3";
    item3.price = 1;
    item3.quantity = 2;

    items.push_back(item1);
    items.push_back(item2);
    items.push_back(item3);


    std::sort(items.begin(), items.end(), Item::SORT_BY_NAME);
    std::cout<<std::endl<<"By name:"<<std::endl;
    for(std::vector<Item>::iterator i = items.begin(); i != items.end(); ++i)
        std::cout<<i->ToString()<<std::endl;

    std::sort(items.begin(), items.end(), Item::SORT_BY_PRICE);
    std::cout<<std::endl<<"By price:"<<std::endl;
    for(std::vector<Item>::iterator i = items.begin(); i != items.end(); ++i)
        std::cout<<i->ToString()<<std::endl;

    std::sort(items.begin(), items.end(), Item::SORT_BY_QUANTITY);
    std::cout<<std::endl<<"By quantity:"<<std::endl;
    for(std::vector<Item>::iterator i = items.begin(); i != items.end(); ++i)
        std::cout<<i->ToString()<<std::endl;

}
于 2012-11-11T21:42:16.950 回答
1

您将使用自定义比较器对象,该对象根据nameprice进行排序quantity

这是std::sort's 功能的一部分。

于 2012-11-11T20:19:03.397 回答
0

std::sort算法有三个参数——first、last和comparator

比较函数对象,它采用与范围中包含的相同类型的两个值,如果第一个参数在其定义的特定严格弱排序中位于第二个参数之前,则返回 true,否则返回 false。

于 2012-11-11T20:19:57.557 回答