2010-08-03 2 views
4

Не могли бы вы сообщить нам, как использовать stl: map в качестве массива измерений? Я хотел получить доступ к отдельным элементам, как mymap [i] [j], где я не знаю заранее, что такое значение i или j. Любые лучшие идеи сделать то же самое по-другому?Как использовать stl :: map как двухмерную матрицу

+0

Есть ли причина, по которой вы используете карту? – dreamlax

+0

Нет, нет особых причин. Не могли бы вы сообщить мне, есть ли лучший вариант? – user243655

+0

@ebtest, знаете ли вы, каков предел значений, которые могут быть i и j? – dreamlax

ответ

21

Вы можете сделать

std::map<int, std::map<int, int> > mymap; 

Например:

#include <map> 
#include <iostream> 

int main() 
{ 
    std::map<int, std::map<int, int> > mymap; 

    mymap[9][2] = 7; 
    std::cout << mymap[9][2] << std::endl; 

    if (mymap.find(9) != mymap.end() && mymap[9].find(2) != mymap[9].end()) { 
     std::cout << "My map contains a value for [9][2]" << std::endl; 
    } else { 
     std::cout << "My map does not contain a value for [9][2]" << std::endl; 
    } 

    return 0; 
} 

печатает 7 на стандартный вывод, а затем "Моя карта содержит значение [9] [2]".

+0

Не могли бы вы дать мне знать, как вставить элемент на эту карту? Не могли бы вы привести пример. В моем случае мне нужно будет хранить указатели объектов на карте. Спасибо. – user243655

+0

Спасибо за ваш ответ. Теперь, как проверить, есть ли элемент в индексе i, j? – user243655

+2

Обновлен мой ответ, чтобы показать, как вставлять и извлекать элемент int из карты. –

0

Вместо этого используйте вместо этого kd-дерево. Каждый уровень ветвления будет поочередно сравнивать значения i j. См. http://en.wikipedia.org/wiki/Kd-tree.

9

Альтернативное решение Эндрю Штейн, который играет лучше с остальной частью STL просто использовать

typedef std::map<std::pair<int, int>, int > AMapT; 
AMapT mymap; 
mymap[std::make_pair(2, 4)] = 10; 
... 
AMapT::iterator f = mymap.find(std::make_pair(3, 5)); 

Например, таким образом, вам не нужно приковать два вызова map::find для поиска одно значение.

+0

Могу ли я использовать это для использования в качестве массива с 3 измерениями? – user243655

+0

Стоит отметить, что 'std :: map' требует, чтобы ключ был меньше, чем сопоставим. Решение Карлоса работает, потому что 'std :: pair' предоставляет лексикографический меньше, чем компаратор. http://www.sgi.com/tech/stl/pair.html – rwong

+0

ebtest, вы можете, но он становится уродливым: 'std :: map >, int> '. Вероятно, вам лучше использовать типы кортежей boost или просто структуру и конструкторы, которые вы откатываете самостоятельно. Как указано в rwong, вам также понадобится оператор сравнения, отличный от сравнения. –

Смежные вопросы