сортировка — Как определить предикат сортировки для шаблонного класса контейнера в переполнении стека

Мой C ++ немного ржавый в последнее время. Может ли один из вас, гуру, помочь мне определить предикат 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;

};

Таким образом, этот класс получает параметр шаблона, который является STRUCT с переменной-членом std :: string.

Я хотел бы определить простой предикат сортировки, чтобы я мог вызвать:
std :: sort (data.begin (), data.end (), sort_xx)
после выполнения:
data.push_back ()
внутри функции-члена add () класса выше.

Как мне это сделать? Я не использую 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;
}

0

Решение

Что можно использовать станд :: find_if, если вам нужен пользовательский предикат.

Чтобы определить предикат 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, вы можете просто использовать лямбду:

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);
}
0

Другие решения


По вопросам рекламы [email protected]