Преобразование уникальной строки в уникальное целочисленное значение в C ++ - PullRequest
0 голосов
/ 17 апреля 2020

В моем проекте есть требование однозначно идентифицировать строки. Интересно, есть ли простой способ представления уникальной строки с уникальным целочисленным значением? Возможно, это связано со значением символов ASCII, но я не мог понять, как это сделать. Например: я хочу, чтобы строка "ankit" представляла уникальное значение. Это уникальное целочисленное значение должно представлять только строку «ankit». А также я хочу преобразовать этот уникальный int в правильную строку, связанную с ним. Я надеюсь, вы понимаете. Если нет, вы можете спросить.

Максимальная длина строки - 32.

Например:

Предположим, у нас есть 4 строки. "ankit" со значением 5. следующий вход "John" со значением 6. Следующий вход - "ankit" со значением 3 и затем "ankit" со значением 3. Так что я хочу хранить накопленную сумму соответствующих строк в одном массиве в их соответствующей позиции вхождений.

Здесь будет создан один массив размером n (количество строк). arr[n] будет храниться arr[0]=5, arr[1]=6, arr[2]=8, arr[3]=11.

1 Ответ

2 голосов
/ 17 апреля 2020

Чтобы отобразить std::string s на целые числа, вы можете использовать std::unordered_map<std::string,int>. Если вы хотите отобразить std::string s на некоторую накопленную сумму целых чисел, это будет std::unordered_map<std::string,std:::vector<int>>, обернутый в вспомогательный класс для реализации логики c накопленной суммы:

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


struct cumsummap {
    std::unordered_map<std::string,std::vector<int>> data;
    std::vector<int> history;
    void add(const std::string& key, int value) {
         auto& v = data[key];
         int sum = (v.size() == 0) ? value : v.back() + value;
         v.push_back(sum);
         history.push_back(sum);
    }
    void print() {
        for (auto& p : data) {
            std::cout << p.first << " : ";
            for (auto& cumsum : p.second) std::cout << cumsum << " ";
            std::cout << '\n';
        }
        for (auto& h : history) {
            std::cout << h << ' ';
        }
    }
};

int main()
{
    cumsummap c;
    c.add("ankit",5);
    c.add("john",6);
    c.add("ankit",3);
    c.add("ankit",3);
    c.print();
}

Вывод :

john : 6 
ankit : 5 8 11 
5 6 8 11 

Примечание. Вопрос и ответ прошли историю разъяснений, поэтому существует карта векторов, когда для получения последней строки выходных данных достаточно карты int s.

PS: Обратите внимание, что важно не путать задачу, которую вы хотите решить, и подробности реализации решения, которое вы имеете в виду. «Так что я хочу, чтобы накопленная сумма соответствующих строк в одном массиве в их соответствующей позиции вхождения». это не точно , что делает приведенный выше код. Также нет видимых хэшей, уникальных целых чисел, и я понятия не имею, что вы имеете в виду под «[...] я хочу преобразовать этот уникальный int в правильную строку, связанную с ним». Тем не менее, я надеюсь, что вышеупомянутое достаточно близко, чтобы хотеть, чтобы вы действительно захотели это сделать.

PPS: «нет никакого способа сделать простой способ без использования STL». Я должен еще раз упомянуть, что использование стандартной библиотеки - это «легкий путь». Я не обучен написанию своих собственных контейнеров, поэтому моя осторожная оценка состоит в том, что написание вышеупомянутого без использования стандартной библиотеки будет> 300 строк кода с неисчислимым количеством ошибок.

...