Структура данных похожа на карту с двумя аргументами - PullRequest
1 голос
/ 13 июля 2009

Существует ли структура данных (легкодоступная в STL или boost), которая принимает два аргумента и сопоставляет их с определенным значением?

Примерами могут быть возвращение определенной информации в координатной сетке или получение веса ребра на графике:

координата_квадранта (-1, -1) = 3

weight_of (u, v) = 10

Пример квадранта может быть выполнен в виде простой функции с четырьмя операторами if. Я в основном ищу пример, который бы соответствовал весовому примеру. Я пытаюсь избежать создания класса ребер и передать его в функцию weight_of (Edge edge).

Ответы [ 3 ]

11 голосов
/ 13 июля 2009

Вы можете использовать std :: map , Type3>.

1 голос
/ 13 июля 2009

Я бы рассмотрел следующие варианты:

Вариант 1

std :: map с std :: pair в качестве ключа и Type3 в качестве значения

std::map< std::pair< Type1, Type2 >, Type3 > data;

Вариант 2

2-мерный стандарт :: вектор

В случае, если Type1 и Type2 являются целыми числами, как вы можете найти при моделировании графа или декартового пространства: std :: vector > data;

Вариант 3

определяемый пользователем класс, содержащий Type1 и Type2, которые могут быть сопоставлены с Type3

Если вам когда-нибудь захочется украсить ваши два типа большим количеством значений, вы можете определить класс, который содержит оба ваших типа, и использовать std :: map для сопоставления его с третьим типом:

public:
    MyClass( Type1 x, Type2 y ) : x_( x ), y_( y )

    Type1 x() const {
        return x_;
    }

    Type2 y() const {
        return y_;
    }


private:
    Type1 x_;
    Type2 y_;
};


std::map< MyClass, Type3 > data;

Преимущество варианта 1 заключается в том, что он действительно быстрый и простой в кодировании и должен иметь смысл для всех, кто знает C ++. Вариант 2, вероятно, немного быстрее и имеет дополнительное преимущество, заключающееся в том, что его можно легко изменить, чтобы получить больше измерений. Недостатком варианта 2 является то, что ваши значения должны быть целочисленными индексами в двумерном векторе.

По моему мнению, вариант 3 - лучший выбор для меня, потому что он читабелен, не предъявляет никаких требований к типу Type1 и Type2 и может быть расширен, чтобы содержать больше данных очень разумным способом. Недостатком варианта 3 является то, что вам нужно определить StrictWeakOrdering для сравнения объектов MyClass друг с другом, но это довольно просто:

bool operator<(const MyClass & rhs) const {
    return ( rhs.x() <= x() && rhs.y() <= y() );
}

Сделайте это функцией-членом вашего класса, и вы должны быть готовы к работе.

Как и многие вещи в программировании, нет очевидного правильного ответа, пока вы не рассмотрите особенности того, что вы делаете, и сколько времени вы готовы инвестировать. Не забудьте проверить наличие ключей и наличие ошибок. :)

0 голосов
/ 13 июля 2009

Используйте объект, который является парой целых чисел на заднем конце. Другими словами, реализовать карту, но для этой пары объектов. Вы не можете переопределить оператор [], чтобы принять несколько аргументов, но вы можете переопределить оператор () в пользовательском классе карты, чтобы вы могли получить некоторый синтаксический сахар, например my_map[row](col) = whatever

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