如何在C ++中按字母顺序排序

时间:2015-03-24 01:09:45

标签: c++ sorting alphabetical

我一直在尝试使用名为姓氏的字符串数据成员对Employee的向量进行排序。我尝试了几种不同的方法,使用矢量的排序方法,尝试将我的矢量转换为列表并使用其排序,我甚至尝试使用字符串比较和>运营商如下图所示:

    vector<Employee>sortE(vector<Employee>record)
{
    for (unsigned int i = 0; i < record.size() - 1; i++)
        if (record[i].getLastName() > record[i+1].getLastName())
            swap(record[i], record[i + 1]);
    return record;
}

我想如果我使用上面的方法和swap函数,它会工作。但也许因为交换是一种字符串方法而且我正在与员工这样做,它不能正常交换?但是我也用我自己的&#34; swap&#34;如下所示:

vector<Employee>sortE(vector<Employee>record)
{
    Employee temp;
    for (unsigned int i = 0; i < record.size() - 1; i++)
        if (record[i].getLastName() > record[i + 1].getLastName())
        {
            temp = record[i];
            record[i] = record[i + 1];
            record[i + 1] = temp;
        }

    return record;
}

无论哪种方式,我都无法让它正常运作,任何见解或帮助都会受到赞赏。

2 个答案:

答案 0 :(得分:2)

如果使用C ++ 11或更新版本,你可以尝试使用lambda(另外,我也不知道你的Employee类是什么样的,所以我做了一个简单的)。另外,请点击此处查看在线执行:http://cpp.sh/6574i

#include <algorithm>
#include <iostream>
#include <string>
#include <vector>

class Employee
{
public:
    Employee( const std::string& firstName, const std::string& lastName ) :
        _firstName( firstName ),
        _lastName( lastName )
    {}

    ~Employee()
    {}

    std::string FirstName() const
    { 
        return _firstName;
    }

    std::string LastName() const
    {
        return _lastName;   
    }

    std::string FullName() const
    {
        return _firstName + " " + _lastName;   
    }

private:
    std::string _firstName;
    std::string _lastName;
};

int main()
{
    Employee e1( "Suresh", "Joshi" );
    Employee e2( "Mats", "Sundin" );
    Employee e3( "Steve", "Nash" );
    std::vector< Employee > employees { e1, e2, e3 };

    std::sort(employees.begin(), employees.end(), 
        [](const Employee& lhs, const Employee& rhs) -> bool
        { 
             return rhs.LastName() > lhs.LastName(); 
        });

    for ( auto employee : employees )
    {
        std::cout << employee.FullName() << std::endl;
    }
}

答案 1 :(得分:1)

您可以向std::sort提供lambda:

std::vector<Employee> ve;
using std::begin;
using std::end;
std::sort(begin(ve), end(ve),
          [](const Employee& lhs, const Employee& rhs)
          {
              return lhs.getLastName() < rhs.getLastName();
          });

那就是说,在现实生活中,姓氏不一定是独一无二的,当他们比较相同时,最好还是回到名字上,如果这个名字也像雇员一样等其他领域ID:

              return lhs.getLastName() < rhs.getLastName() ||
                     lhs.getLastName() == rhs.getLastName() &&
                     (lhs.getFirstName() < rhs.getFirstName() ||
                      lhs.getFirstName() == rhs.getFirstName() &&
                      lhs.getId() == rhs.getId());