按字母顺序按成员在C ++中对对象列表进行排序

时间:2012-02-24 00:09:26

标签: c++ sorting

我正在尝试创建一个函数,按名称或姓氏对地址簿中的联系人列表进行排序。

 void sortList (list<Contact> & address_book){

 //define two iterators - first to point to the first element from the list, second to the second element
 list<Contact>::iterator it = address_book.begin();
 list<Contact>::iterator it2 = address_book.begin();
 it2++;

 //get the last name for the first 2 contacts
 string last_name1 = it->get_last_name();
 string last_name2 = it2->get_last_name();

 int i = 0;

 while (i < last_name1.length() && i < last_name2.length()){

       if (last_name1[i] < last_name2[i]){
          swap(it, it2);
          break;
       }

 }
}

我确定我没有正确地做到这一点,但我对这些迭代器有点失落。我也知道我应该有另一个while循环遍历所有联系人,直到所有联系人都被排序,但老实说我不知道​​如何实现它。

3 个答案:

答案 0 :(得分:6)

std :: list有一个重载的成员函数排序,即

  

按升序对元素进行排序。保证保持相等元素的顺序。第一个版本使用运算符&lt;为了比较元素,第二个版本使用给定的比较函数comp。

要提供比较功能,您可以使用仿函数

struct sort_by_name {
  bool operator()(const Contact &a, const Contact &b)
  { return a.get_name() < b.get_name(); }
};
struct sort_by_last_name {
  bool operator()(const Contact &a, const Contact &b)
  { return a.get_last_name() < b.get_last_name(); }
};

或更简单的免费功能

bool cmp_by_name(const Contact &a, const Contact &b)
{ return a.get_name() < b.get_name(); }
bool cmp_by_last_name(const Contact &a, const Contact &b)
{ return a.get_last_name() < b.get_last_name(); }

你可以称之为

 address_book.sort(sort_by_name());
 address_book.sort(sort_by_last_name());

 address_book.sort(cmp_by_name);
 address_book.sort(cmp_by_last_name);

访问器get_name()和get_last_name()必须是const。

答案 1 :(得分:4)

不要自己排序。使用std::sort()。您需要提供自定义比较器 - 如下所示:

struct LastNameComp {
    bool operator()(const Contact& a, const Contact& b) const {
        return a.get_last_name() < b.get_last_name();
    }
}
⋮
std::sort(address_book.begin(), address_book.end(), LastNameComp());

如果您可以访问C ++ 11编译器,则可以做得更好:

std::sort(address_book.begin(), address_book.end(),
    [](const Contact& a, const Contact& b) {
        return a.get_last_name() < b.get_last_name();
    });

答案 2 :(得分:1)

扩展使用std::lexicographical_compare给出的答案并列出内部排序。

    struct LastNameComp {
        bool operator()(const Contact& a, const Contact& b) {
            return std::lexicographical_compare(
               a.get_last_name().begin(), a.get_last_name().end(),
               b.get_last_name().begin(), b.get_last_name().end(),  
            );
        }
    };

    address_book.sort(LastNameComp());