Как сохранить кортеж из четырех параметров со значением в c ++ - PullRequest
0 голосов
/ 08 января 2020

Как я могу сохранить четыре параметра со значением в c ++ и иметь возможность их вызова.

Например, у меня есть параметры u, k, i, childEdge и значение с именем val.

Я хочу хранить их так: (5,4,6,1) = 42.

И иметь возможность получить к ним доступ примерно так: int answer = find (5,4,6,1 ) так что ответом будет 42

Я использовал 4D массив, но для больших входов он, кажется, не работает в c ++

Ответы [ 6 ]

4 голосов
/ 08 января 2020

Итак, вам нужна карта из четырех параметров в одно значение. Вы можете использовать std::map или std::unordered_map в зависимости от ваших потребностей 1 . Основной вопрос - как express ключ с четырьмя значениями. Вот несколько вариантов:

  • using MyKey = std::tuple<int, int, int, int>;

  • using MyKey = std::array<int, 4>;

  • struct Parameters { int u, k, i, childEdge; };
    using MyKey = Parameters;

Тогда ваша структура данных будет std::map<MyKey, int> или std::unordered_map<MyKey, int>.

Я бы предпочел вариант struct, поскольку он самый чистый. Однако вам придется предоставить operator< для std::map или std::hash и operator== для std::unordered_map для работы с ним (или эквивалентно, используя такие функторы в качестве дополнительных аргументов шаблона для карт). Изучите "пользовательский ключ std :: map" или подобный, чтобы узнать больше, см. здесь или здесь .

1 Есть другие параметры, такие как сортировка std::vector, которые могут или не могут превзойти ассоциативные контейнеры, в зависимости от ваших моделей использования. Но это топи c здесь.

2 голосов
/ 08 января 2020

Вы можете использовать std :: map. Я полагаю, что вы можете использовать map.find, чтобы получить свое значение.

1 голос
/ 08 января 2020

Используйте std::array в качестве ключа. Вы должны будете предоставить свою собственную функцию ha sh:

#include <array>
#include <boost/functional/hash.hpp>
#include <functional>
#include <iostream>
#include <unordered_map>

namespace std {
template <typename T, size_t sz>
struct hash<array<T, sz>> {
  [[nodiscard]] size_t operator()(array<T, sz> const& arr) const noexcept {
    return ::boost::hash_range(arr.cbegin(), arr.cend());
  }
};
}  // namespace std

int main() {
  std::unordered_map<std::array<int, 4>, int> m;
  m[{5, 4, 6, 1}] = 42;
  m[{1, 2, 3, 4}] = 1234;
  m[{2, 2, 2, 2}] = 2222;

  std::cout << m[{5, 4, 6, 1}] << '\n';
}
0 голосов
/ 08 января 2020

Как насчет карты кортежа и типа int, например std:map<std::tuple<int, int, int, int>&, int>. Таким образом, вы сможете использовать кортеж непосредственно в качестве ключа, поскольку он хранится в качестве ссылки.

Однако я бы предложил совершенно иной подход, чем использование tuple. Почему бы не создать класс только для всех 5 предметов. А затем получите list этих объектов или std::unordered_map, если вы хотите улучшить доступ к этим данным.

0 голосов
/ 08 января 2020

Как сохранить четыре параметра со значением

Написать класс:

struct Key {
    int  u, k, i, childEdge;
};

Объекты типа Key сохранят четыре параметра в одном .

И иметь возможность получить к ним доступ примерно так: int answer = find (5,4,6,1)

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

0 голосов
/ 08 января 2020

Вы можете использовать карту, в ключах 5, 4, 6 и 1 значение будет 42. Затем функция поиска получает параметры и ищет их на карте.

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