1

次のようなクラスがあるとしましょう:

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

等...

そして、私はこのクラスアイテムで構成されるベクトルを持っています。ユーザーがアイテムを名前でソートしたい場合のように、ユーザー入力に従ってベクトルをソートするにはどうすればよいでしょうか。名前などでソートします.

編集::わかりましたので、クラスアイテムがあり、クラスインベントリもあります:

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

シナリオでの使用方法をよりよく説明するためstd::sortに、クラスの 3 つのフィールドに対して定義された 3 つの比較関数を含む完全な例を次に示します。

#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 に答える
2

ソートするフィールドごとに比較関数を記述し、ユーザー入力に応じて正しいものを選択するだけです。

ソートを見る

于 2012-11-11T20:20:34.357 に答える
1

またはに従ってソートするカスタム コンパレータ オブジェクトを使用しnameます。pricequantity

これはstd::sortの機能の一部です。

于 2012-11-11T20:19:03.397 に答える
0

std::sortalgorithm には、 first 、 last 、およびcomparisonという 3 つのパラメーターがあります。

範囲に含まれる値と同じ型の 2 つの値を取り、定義された特定の厳密な弱い順序で最初の引数が 2 番目の引数よりも前にある場合は true を返し、そうでない場合は false を返す比較関数オブジェクト。

于 2012-11-11T20:19:57.557 に答える