Could you let us know how to use stl:map as two dimension array? I wanted to access the individual elements as like mymap[i][j] where I do not know beforehand what the value of i or j could be. Any better ideas to do the same thing in other way?
+6
A:
You can do
std::map<int, std::map<int, int> > mymap;
For example:
#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;
}
prints 7 on the standard output, followed by "My map contains a value for [9][2]".
Andrew Stein
2010-08-03 02:38:39
Could you let me know how do I insert an element in this map? Could you provide an example. In my case I would need to store object pointers in the map. Thank you.
2010-08-03 02:43:46
Thanks for your reply. Now how to check if there is an element at index i,j?
2010-08-03 02:47:51
Updated my answer to show how to insert and extract an int element from the map.
Andrew Stein
2010-08-03 02:52:29
Thank you. I wanted to know how to find out if there is a valid element at index i,j? That means I wanted to test the validity of position [i][j] before I try to access the element.
2010-08-03 02:56:47
@ebtest, testing for a value at an index is a little more complicated. You have to do it in two steps, check the first index then if it exists use the result to check for the second index, with the `find` member function.
Mark Ransom
2010-08-03 02:57:17
Updated the example to show how to check if the map contains an element.
Andrew Stein
2010-08-03 02:59:39
@Andrew Stein: +1, but the downfall to your method of checking for existence is that it can't be used from within a const-qualified method (since there is no `operator[] const` for `std::map`).
dreamlax
2010-08-03 03:05:26
Could you please explain a little bit?
2010-08-03 03:22:45
shouldn't it be `else { cout << "DOESN'T contain value for [9][2]"; }`?
Graphics Noob
2010-08-03 05:28:28
@Graphics fixed
Andrew Stein
2010-08-03 13:38:16
@dreamlax -- you are quite correct. But I guess I should leave *something* as an exercise for the reader :-)
Andrew Stein
2010-08-03 13:40:01
A:
Consider using a kd-tree instead. Each level of branching will compare the i an j values in turn. See http://en.wikipedia.org/wiki/Kd-tree.
BennyG
2010-08-03 02:51:40
+3
A:
An alternative solution to Andrew Stein's which plays nicer with the rest of STL is to simply use
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));
For example, with this way you don't need to chain two calls to map::find
to search for a single value.
Carlos Scheidegger
2010-08-03 03:06:41
Worth pointing out that `std::map` requires the key to be less-than comparable. Carlos' solution works because `std::pair` provides a lexicographic less-than comparator. http://www.sgi.com/tech/stl/pair.html
rwong
2010-08-03 04:04:11
ebtest, you can, but it gets ugly: `std::map<std::pair<int, std::pair<int, int> >, int>`. You're probably better off with boost's tuple types or just a struct and constructors that you roll your own. As rwong pointed out, you'll also need a less-than comparison operator.
Carlos Scheidegger
2010-08-03 04:53:51