0

最近、私の C++ は少し錆びています。あなたの専門家の 1 人が、それ自体が別のクラスであるテンプレート パラメーターを使用して、コンテナー クラスの SORT 述語を定義するのを手伝ってくれませんか。

template <class Element>
class OrderedSequence
// Maintains a sequence of elements in
// ascending order (by "<"), allowing them to be retrieved
// in that order.
{


 public:
 // Constructors
 OrderedSequence();

 OrderedSequence(const OrderedSequence<Element>&);

 // Destructor
 ~OrderedSequence(); // destructor

 OrderedSequence<Element>& operator= (const OrderedSequence<Element>& ws);

 // Get an element from a given location
 const Element& get (int k) const;



// Add an element and return the location where it
// was placed.
int add (const Element& w);

bool empty() const      {return data.empty();}
unsigned size() const   {return data.size();}


// Search for an element, returning the position where found
// Return -1 if not found.
int find (const Element&) const;


void print () const;

bool operator== (const OrderedSequence<Element>&) const;
bool operator< (const OrderedSequence<Element>&) const;

private:

std::vector<Element> data;

};

したがって、このクラスは std::string メンバー変数を持つ STRUCT であるテンプレート パラメーターを受け取ります。

add() メンバー内で : data.push_back() を実行した後、 std::sort(data.begin(), data.end(), sort_xx) を呼び出すことができるように、単純なソート述語を定義したいと思います上記のクラスの機能。

どうすればいいのですか?私は C++ 11 を使用していません。単純な古い C++ を使用しています。

テンプレート パラメーター Element.. は次のように変換されます。

struct AuthorInfo 
{
string name;
Author* author;

AuthorInfo (string aname)
   : name(aname), author (0)
 {}

bool operator< (const AuthorInfo&) const;
bool operator== (const AuthorInfo&) const;
};

bool AuthorInfo::operator< (const AuthorInfo& a) const
{
   return name < a.name;
}

bool AuthorInfo::operator== (const AuthorInfo& a) const
{
  return name == a.name;
}
4

1 に答える 1

0

カスタム述語が必要な場合、std::find_ifを使用できるもの。

Predicate ala C++03 を定義するには:

// For find()
struct MyPredicate
{
public:
  explicit MyPredicate(const std::string name) name(name) { }

  inline bool operator()(const Element & e) const { return e.name == name; }

private:
  std::string name;
};

// Assuming you want to lookup in your vector<> member named "data"
std::find_if(data.begin(), data.end(), MyPredicate("Luke S."));

// To sort it, its exactly the same but with a Sort comparer as the predicate:
struct MySortComparator
{
 bool operator() (const Element& a, const Element& b) const
 {
    return a.name < b.name;
 }
};

std::sort(data.begin(), data.end(), MySortComparator());

// Or you can style sort Author without predicates if you define `operator<` in the `Element` class :
std::sort(data.begin(), data.end())

C++11 を使用できる場合は、単純に lambda を使用できます。

std::find_if(data.begin(), data.end(), [](const Element & e) -> bool { return e.name == "Luke S."; });

編集:

ですでにオーバーロードされElementていることがわかります。次のこともできます。operator==Author

int find (const Element& e) const
{
  std::vector<Element>::iterator iter = std::find(data.begin(), data.end(), e);
  return std::distance(data.begin(), iter);
}
于 2014-06-11T23:51:43.670 に答える