Как создать уникальный ключ, заданный произвольным числом целых чисел? И использовать этот ключ для хранения и последующего поиска с карты - PullRequest
0 голосов
/ 13 июня 2019

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

Я рассмотрел различные варианты, которые включают использование Tuple, Hashing and Concatenation int для генерации ключа, но не в состоянии найти оптимальное решение.

Ожидаемая функция или логика должна принимать массив int, а взамен она должна давать уникальный ключ (int).

Например,

Пример ввода может быть [1,5,6],Клавиша [134,1] [6,5,1] [1,5,6] должна совпадать с [6,5,1]

1 Ответ

1 голос
/ 13 июня 2019

Как я понимаю ваш вопрос (в основном из комментариев), вы хотите поместить некоторую структуру данных в карту и использовать массив целых чисел в качестве ключа, где различные порядки целых чисел должны фактически рассматриваться как один и тот же ключ.

Для примера скажем, что "некоторая структура данных" - это std::string, тогда самым простым является использование std::set в качестве ключей, потому что независимо от того, какой порядок вы используете для построенияset, 1 5 6, 1 6 5 или 6 5 1, вы получите то же самое set:

#include <string>
#include <map>
#include <iostream>

int main() {
    std::map< std::set<int>, std::string> x;
    x[ { 1,5,6} ] = "Hallo";    
    std::cout << x[ { 6 , 5, 1} ] << "\n";    
}

Живой пример

ЭтоНемного расточительно использовать set только для сортировки элементов, так что вы можете использовать вместо этого отсортированный вектор.Чтобы пользователю карты не нужно было сортировать вектор, вы можете использовать вспомогательный тип, например:

#include <string>
#include <vector>
#include <map>
#include <algorithm>
#include <iostream>
#include <initializer_list>

struct sorted_vector {
    std::vector<int> x;
    sorted_vector(std::initializer_list<int> l) : x(l) {
        std::sort(x.begin(),x.end());       
    }
    bool operator<(const sorted_vector& other) const {
        return x < other.x;
    }
};

int main() {
    std::map< sorted_vector, std::string> x;
    x[ { 1,5,6} ] = "Hallo";    
    std::cout << x[ { 6 , 5, 1} ] << "\n";   
}

Живой пример

Я понимаю, что выбеспокоятся об эффективности, особенно когда вектор содержит много элементов.Однако, если вы действительно не достигнете предела или не профилируете свой код и не поймете, что вам нужно что-то улучшить, я бы не стал изобретать велосипед.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...