基于类成员搜索/排序链接列表(C ++)

时间:2015-11-24 22:40:44

标签: c++ linq lambda

我有一个我正在创建的程序,涉及使用链表来存储我的数据。以下是节点和列表类的定义:

template<class T>
struct Node{
    T data;
    Node *link;
};

template<class T>
class LinkedList{
private: 
    Node<T> *head;
public:
    LinkedList(){
        head = NULL;
    }
};

我有不同的类(例如人物,物品等),每个类都有自己的列表。我希望能够根据班级成员订购这些列表,但如果没有大量不同的排序功能,我不知道如何做到这一点。

我来自C#背景,其中LINQ允许类似:

PersonList.OrderBy(x=>x.LastName)

将根据Person类的姓氏对该列表进行排序。

我希望能够在C ++中做类似的事情,但我仍然对语言不熟悉并且不确定它会带来什么。

1 个答案:

答案 0 :(得分:0)

如果你想留在自制的链表类中,你需要一般性地编写你的排序,并且只能在&#34;交换&#34;标准。这是一个它的样子的模型(注意 - 没有编译,所以借口任何语法错误):

template<class T>
  class LinkedList{
  private: 
    Node<T> *head;
    typedef bool (*cmpFunc)(T &a, T &b);

  public:
    LinkedList(){
        head = NULL;
    }

   void Sort(cmpFunc)
   {
      T* item1, *item2; 
      // whatever sorting routine you choose, doesn't matter.
      //...
      // now we are at the point in our routine where we need to compare two items
      if ( !cmpFunc(*item1, *item2) )
      {
          // we swap item1 and item2's position since the comparison
          // function says that item1 should come after item2 (the return
          // of false did this).
      }
   }
};

class Person
{
   int age;
   public:
       int getAge() const { return age; }
       Person(int n = 1) : age(n) {}
};    
...
bool CompFunction(int& i1, int& i2)
{
   return i1 > i2;  // return true if i1 > i2, false otherwise
}

bool personComp(Person& p1, Person& p2)
{
   return p1.getAge() < p2.getAge();  // sort on the age (for example)
}

LinkedList<int> l1;
//... fill it with values
l1.Sort(&CompFunction);  // will sort the ints in descending order

LinkedList<Person> p;
//... fill p with Person objects
p.Sort(&personComp);  // sorts person based on age in ascending order

请注意,我没有为您提供排序例程,算法等。重点是无论您选择何种排序算法或例程,当涉及两个项目的比较时,您都会调用用户定义的cmpFunc具有这两项功能。

因此,用户为您提供了该功能,并且该功能是进行自定义比较的地方。如果函数返回true,则传递的参数顺序正确,否则返回false。您的交换例程检查返回值,并在返回false时交换项目。

请注意,这是一个粗略的设计,但它展示了当您需要使用不同的标准时如何实现交换功能的基本要点。