Сравнение строк на русском

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

Пушкин А.С. «Евгений Онегин»
Тургенев И.С. «Отцы и дети»
Логинов С.В. «Свет в окошке»
Пушкин А.С. «Евгений Онегин»
Стругацкий Б.Н., Стругацкий А.Н. «Понедельник начинается в субботу»
Янссон Т.С. «Волшебная зима»
Тургенев И.С. «Отцы и дети»
Толстой Л.Н. «Война и мир»

Есть отдельный массив номеров , который присваивается строкам по возрастанию , например (при этом строки не сортируются, а просто сравниваются):

2. Пушкин А.С. «Евгений Онегин»
5. Тургенев И.С. «Отцы и дети»
1. Логинов С.В. «Свет в окошке»
2. Пушкин А.С. «Евгений Онегин»
3. Стругацкий Б.Н., Стругацкий А.Н. «Понедельник начинается в субботу»
6. Янссон Т.С. «Волшебная зима»
5. Тургенев И.С. «Отцы и дети»
4. Толстой Л.Н. «Война и мир»

У меня есть реализация для случая , когда среди строк нету равных , но как переделать цикл , чтобы он учитывал и равные строки тоже ?

for (int i = 0; i < n; i++) {
k = 1;
for (int j = 0; j < i; j++) {
if (strcmp(Name[i].c_str(), Name[j].c_str())==1)
k++;
}//исключаем сравнение Name[i] книги с Name[j]
for (int j = i + 1; j < n; j++) {
if (strcmp(Name[i].c_str(), Name[j].c_str())==1)
k++;
}
A[i] = k;

Если I-ая строка больше J-ой и при этом 
среди строк , есть еще какая то строка
 (как минимум одна , которая равна J-ой) ,
 то номер для i-ой строки прибавится на одну
 лишнюю единицу(или на несколько единиц  ,
в зависимости от того , сколько книг будет равных j-ой )
 , и вместо таких номеров (например) :
1.abba           будет : 1.abba
2.bcda                   3.bcda      потому что мы bcda сравнили с индексом 1 и и
1.abba                   1.abba          индексом 3, и два раза прибавили единицу 
3.flow                   4.flow          , получилось 3(изначально k=1) , что
                                                 НЕВЕРНО

Ответы (1 шт):

Автор решения: neon1ks

В качестве решения можно добавить еще один цикл, для проверки повторов. Это не образцовое решение:

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

int main()
{
    std::vector<std::string> Name = { { "Пушкин А.С. «Евгений Онегин»" },
        { "Тургенев И.С. «Отцы и дети»" }, { "Логинов С.В. «Свет в окошке»" },
        { "Пушкин А.С. «Евгений Онегин»" },
        { "Стругацкий Б.Н., Стругацкий А.Н. «Понедельник начинается в "
          "субботу»" },
        { "Янссон Т.С. «Волшебная зима»" }, { "Тургенев И.С. «Отцы и дети»" },
        { "Толстой Л.Н. «Война и мир»" } };
    std::vector<int> A = {};

    auto n = Name.size();
    unsigned int k = 0;

    for (unsigned int i = 0; i < n; ++i) {
        k = 1;
        for (unsigned int j = 0; j < n; ++j) {
            if (i != j) {
                if (Name[i] > Name[j]) {
                    bool isNew = true;
                    for (unsigned int jj = 0; jj < j; ++jj) {
                        if (Name[jj] == Name[j]) {
                            isNew = false;
                            break;
                        }
                    }
                    if (isNew) {
                        ++k;
                    }
                }
            }
        }
        A.push_back(k);
    }

    for (unsigned int i = 0; i < n; ++i) {

        std::cout << A[i] << " : " << Name[i] << std::endl;
    }

    return 0;
}

→ Ссылка