2016-06-02 3 views
-2

Я работал в течение последних нескольких дней в этом проекте. Моя проблема в том, что касается функции сортировки, она разваливается. Я чувствую, что мне не хватает параметра функции сортировки. Возможно, более опытные глаза могут видеть мою ошибку. Цель состоит в том, чтобы пользователь вводил строку, применял ее к массиву class person, сортировал, а затем печатал на консоль. Раздел ввода работает отлично, но функция сортировки даже не компилируется, я не включил эту часть, но если она понадобится, я также опубликую ее.C++ Сортировка Класс String Array

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

using namespace std; 

//class declaration 

class Person{ 
public: 
    string lastName; 
    string firstName; 
}; 

//variables 

int entry; // defined in other function 
string choice; //defined in other function 

//arrays 

Person nameArray[10]; 

//function declarations 

void sortView(){ 

    sort(nameArray[0].lastName.begin(), nameArray[0].lastName.end() + entry); 

    for (int i = 0; i < entry; i++){ 
     cout << nameArray[i].lastName; 
     cout << ", "; 
     cout << nameArray[i].firstName; 
     cout << endl; 
    } 
}; 
+0

Посмотрите на документ для [sort] (http://en.cppreference.com/w/cpp/algorithm/sort), который не работает * вообще * – Borgleader

+0

Проблема в том, что вся документация для сортировки ссылается к использованию типов данных int, для этого назначения вход должен быть строкой. Мне хорошо известно, что строка на базовом уровне - это значения int, но я не понимаю, чего я не вижу. – Infynix

+0

да так? связанный с ним документ показывает, как использовать пользовательскую функцию сравнения, которая * точно * то, что вам нужно. Тот факт, что примеры использует int, а не строку, не имеет значения. – Borgleader

ответ

1

std::sort() принимает два требуемых параметров: начало значение итератора и конечное значение итератора, который определяет последовательность для сортировки.

Что вы передаете в std::sort() не выглядит удаленно, как пара итераторов. Он даже не компилируется.

NameArray.lastName недопустим C++. NameArray - массив. Оператор . используется со структурами или классами, а не с массивами.

Чтобы разобраться в этом десять-элементный массив, который вы обычно используете:

sort(NameArray, NameArray+10); 

воспользовавшись тем, что использование имени Массив в выражении дает Вам указатель на первый элемент массива, и эти в этом контексте указатели будут логически эквивалентны итераторам.

Однако это не будет работать, здесь, потому что не определено, как можно сравнивать элементы NameArray. NameArray содержит экземпляры класса person, и вы можете осмысленно сортировать что-то, только если вы можете сравнивать разные значения с помощью оператора <, чтобы сортировать меньшие значения перед большими значениями, конечно.

Чтобы отсортировать этот массив вы также должны либо:

1) Пропустите третий необязательный параметр std::sort(), лямбда, который сравнивает два экземпляра person класса или

2) Внедрите метод члена operator< в классе person.

1
sort(std::begin(NameArray), std::end(NameArray), [](const person& p1, const person& p2) { 
    // write your sort logic, for example 
    return p1.lastName < p2.lastName; 
}); 

Для std::sort, вам необходимо предоставить два итератора и функция сравнения

0

Хорошо, это не то, как массивы работы.

NameArray даст указатель на первый элемент массива, NameArray + 10 даст указатель на одиннадцатый элемент, но NameArray.lastName не существует. NameArray - массив, а не человек. Каково последнее имя массива?

Что вы хотите сделать, это применить sort к NameArray и отсортировать его по его фамилии. Он применяется к NameArray, поэтому он должен быть:

sort(NameArray, NameArray + entry).

Теперь у вас будет другая ошибка компиляции.sorting function нуждается в способе сравнения двух person (и вы должны начинать имена классов с прописными буквами!).

Существует два способа сделать это. Вы можете считать, что person всегда уступает другому на основании их lastName, и в этом случае вы перегрузите оператора <person.

Или вы зададите специальный способ для сравнения элементов вашей функции сортировки:

sort(NameArray, NameArray + entry, [](const person &p1, const person &p2) { 
    return p1.lastName < p2.lastName; 
}); 

ли some reading понять немного больше, вы можете также искать лямбда-функции.


PS: Сохраняйте имена, начинающиеся с прописных букв, являющихся вашими классами, именование переменных, подобных этому, является сбивающим с толку.

Вы также можете найти std::vector или std::valarray как альтернативы использованию массива фиксированного размера.