Другие ответы продемонстрировали способ, которым необходимо сделать это. Вот способ, которым Вы не были должны:
>>> def foo(counter=[0]):
... counter[0] += 1
... print("Counter is %i." % counter[0]);
...
>>> foo()
Counter is 1.
>>> foo()
Counter is 2.
>>>
Значения по умолчанию инициализируются только, когда функция сначала оценена, не каждый раз, когда она выполняется, таким образом, можно использовать список или любой другой изменяемый объект сохранить статические значения.
Используйте std :: pair
std::map<std::pair<int,int>, int> myMap;
myMap[std::make_pair(10,20)] = 25;
std::cout << myMap[std::make_pair(10,20)] << std::endl;
I usually solve this kind of problem like this:
struct Point {
int x;
int y;
};
inline bool operator<(const Point& p1, const Point& p2) {
if (p1.x != p2.x) {
return p1.x < p2.x;
} else {
return p1.y < p2.y;
}
}
Каковы требования к классу, который будет использоваться в качестве ключа?
Карта должна иметь возможность определять, меньше ли значение одного ключа, чем значение другого ключа: по умолчанию это означает, что (key1 В шаблоне карты также реализован перегруженный конструктор, который позволяет передавать ссылку на функциональный объект типа key_compare, который может реализовывать оператор сравнения: так что в качестве альтернативы сравнение может быть реализовано как метод этого внешнего функционального объекта, вместо того, чтобы быть привязанным к любому типу вашего ключа.
Boost имеет контейнер карты, который использует один или несколько индексов.
Используйте std :: pair. Лучше даже использовать QHash
, если у вас много таких сопоставлений.