#include "stdafx.h" #include #include #include #include #include using namespace std; bool Compare(const string &left, const string &right); size_t FindSurnameIndex(const string &fio); int main() { vector names; //вводим данные names.push_back("J.X.Smith"); names.push_back("B.A. Weiter"); names.push_back("A.C. Johnes"); //сортировка std::sort(names.begin(), names.end(), Compare); //вывод на экран for (auto name = names.begin(); name != names.end(); name++){ cout << *name << endl; } system("pause"); return 0; } //Сравнение 2-х ФИО bool Compare(const string &left, const string &right){ //Находим индексы начала фамилий size_t left_index_dot = FindSurnameIndex(left); size_t right_index_dot = FindSurnameIndex(right); //Сравниваем фамилии for (size_t i = left_index_dot, j = right_index_dot; i < left.length(), j < right.length(); i++, j++){ if (left[i] < right[j]) return true; if (left[i] > right[j]) return false; if ((i + 1 == left.length()) && (j + 1 < right.length())) return true; if ((i + 1 < left.length()) && (j + 1 == right.length())) return false; if ((i + 1 == left.length()) && (j + 1 == right.length())) return true; } return true; } //Возвращает позицию фамилии size_t FindSurnameIndex(const string &fio){ //находим позицию первой точки size_t first_dot = fio.find('.'); size_t non_space; //если точки нет, то возвращаем позицию первого не пробела (или 0 если все пробелы) if (first_dot == string::npos){ non_space = fio.find_first_not_of(' '); if (non_space == string::npos) return 0; return non_space; } //находим позицию второй точки size_t second_dot = fio.find('.', first_dot + 1); //если точки нет, то возвращаем позицию первого не пробела (или 0 если все пробелы) после первой точки if (second_dot == string::npos){ non_space = fio.find_first_not_of(' ', first_dot + 1); if (non_space == string::npos) return 0; return non_space; } //возврат позиции не пробела после второй точки non_space = fio.find_first_not_of(' ', second_dot + 1); if (non_space == string::npos) return second_dot + 1; return non_space; }