Вы почти наверняка можете добиться большего успеха, чем преобразование в строку (что, как правило, довольно медленная операция). Если ваши три элемента имеют достаточно малые диапазоны, вы можете сделать некоторые сдвиги и сложения, чтобы соединить их в одно целое число с большим диапазоном.
Не имея этого, вы можете просто создать структуру, которая содержит три целых числа и определяет operator<
для их разумного сравнения:
class key {
int a, b, c;
public:
bool operator<(key const &other) {
if (a < other.a)
return true;
if (a > other.a)
return false;
if (b < other.b)
return true;
if (b > other.b)
return false;
if (c < other.c)
return true;
return false;
}
};
Edit: для тех, кому это нужно, использование (std | tr1 | boost) :: tuple не сильно изменит характер ответа, но устранит большую часть кода. Кортеж очень похож на std::pair
, за исключением того, что он поддерживает произвольное количество элементов вместо двух. В приведенном выше примере вы можете использовать что-то вроде:
#include <tuple>
namespace stdx = std::tr1; // or stdx=boost::tr1, etc.
typedef stdx::tuple<int, int, int> key_t;
std::map<key_t, whatever> my_map;
tuple
определяет операторы сравнения автоматически, предполагая, что типы сравнимы (т. Е. Для сравнения двух кортежей с одинаковым количеством элементов, а типы соответствующих элементов сравнимы). В этом случае выполняется лексикографическое сравнение (т. Е. Результат сравнения - результат первой пары соответствующих элементов, которые не равны - ни один такой элемент не существует, два сравнения равны).