2015-03-24 3 views
0

Я пытался сортировать вектор Employee's с членом данных строки, называемым именем. Я попробовал несколько различных способов, с помощью метода сортировки вектора, пытаясь преобразовать свои векторы в список и использовать его сортировку, я даже попытался с помощью строки сравнения и> операторы, как показано ниже:Как сортировать по алфавиту в C++

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 - это строковый метод, и я делаю это с Employees, он не будет меняться нормально? Но я также попробовал это с моей «своп», как показано ниже:

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

В любом случае я не могу заставить его работать должным образом, любое понимание или помощь будет оценена.

+0

Вам нужно написать свой собственный сортировочный код? Если это так, то ни одно из приведенных выше не является правильным. См. [Здесь] (http://www.sorting-algorithms.com/) для разных методов сортировки или используйте std :: sort. – OldProgrammer

+0

Нет, я просто пытался найти способ сортировки – CodeLink

ответ

2

Вы можете попробовать использовать лямбду при использовании C++ 11 или более поздней версии (также, я не знаю, что ваш класс 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

Ahhh, избитый удар Тони. – SJoshi

+1

, но вы потрудились поставлять полную программу ... приятно! –

+0

Спасибо, я попробовал Ishamael, и он работал отлично, насколько я могу судить, что похоже на то, что вы дали (не полностью) – CodeLink

1

Вы можете предоставить лямбда-std::sort:

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

, что сказал, в реальной жизни фамилии не обязательно являются уникальными, и когда они считаются равными, это хорошая идея, чтобы упасть обратно на первое имя, и если что также равно некоторые другие места, как идентификатор сотрудника:

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

Я не уверен, что вы подразумеваете, предоставляя лямбду, я довольно новичок в C++, но, как кажется, общая тема среди этих ответов для использования const (s) и вернуть сравнение, например, e.lastname CodeLink

+2

«[] (const employee & ...) {...}' бит - это «лямбда» - это в основном определение анонимной функции на месте, 'sort' алгоритм, как сравнить двух' Employee's. Лямбда может принимать параметры «Employee» в качестве ссылок 'const', потому что не нужно изменять« Employee 's, который он сравнивает, - это просто говорит алгоритму, как они сравниваются, и алгоритм выполняет обмен/перемещение/он-потребности обеспеченных. Ваш 'vector' сам по себе не должен быть' const', или алгоритм 'sort' не сможет изменить его в отсортированном порядке. –

+0

Ah хорошо, спасибо за объяснение – CodeLink

Смежные вопросы