Я бы рассмотрел следующие варианты:
Вариант 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() );
}
Сделайте это функцией-членом вашего класса, и вы должны быть готовы к работе.
Как и многие вещи в программировании, нет очевидного правильного ответа, пока вы не рассмотрите особенности того, что вы делаете, и сколько времени вы готовы инвестировать. Не забудьте проверить наличие ключей и наличие ошибок. :)