Как делают Вы сортируете массив строк в C++, который заставит это произойти в этом порядке:
г-н Anka
Коричневый г-на
г-н Ceaser
г-н donK
г-н ålish
Г-н Ätt
г-н önD
//following not the way to get that order regardeless upper or lowercase and å, ä, ö
//in forloop...
string handle;
point1 = array1[j].find_first_of(' ');
string forename1(array1[j].substr(0, (point1)));
string aftername1(array1[j].substr(point1 + 1));
point2 = array1[j+1].find_first_of(' ');
string forename2(array1[j+1].substr(0, (point2)));
string aftername2(array1[j+1].substr(point2 + 1));
if(aftername1 > aftername2){
handle = array1[j];
array1[j] = array1[j+1];
array1[j+1] = handle;//swapping
}
if(aftername1 == aftername2){
if(forname1 > forname2){
handle = array1[j];
array1[j] = array1[j+1];
array1[j+1] = handle;
}
}
Таблицы и преобразования.
Сначала я бы преобразовал строку либо во все прописные, либо во все строчные буквы:
#include <cctype>
#include <algorithm>
#include <string>
std::string test_string("mR BroWn");
std::transform(test_string.begin(), test_string.end(),
test_string.begin(),
std::tolower);
Затем я бы проверил исключения или использовал таблицу эквивалентности. Если символ, о котором идет речь, находится в массиве символов-исключений, то используйте таблицу эквивалентности.
Раньше я использовал stricoll для сортировки имен, который сравнивает строки, следующие за текущей локалью. Хотя это сработало для строк в текущей локали, это не сработало, когда вы имеете дело с именами из разных локалей в одной и той же базе данных.
Как только вы добавите символы Юникода в микс, вы должны начать думать об интернационализации. На разных языках действуют разные правила сортировки. Например, в голландском языке «IJ» считается отдельной буквой и занимает свое место в алфавите. Я рекомендую хорошую библиотеку Unicode для выполнения лексических сравнений строк, а именно Международные компоненты для Unicode: http://site.icu-project.org/
При этом вы можете просто использовать обычный std: : sort
с компаратором ICU.