Re: Looking for container like std::map but for ranges
guido wrote:
Hi,
I'm looking for a container class that can map whole ranges of keys to
objects - something like std::map, but not only for individual values for
the key, but for whole ranges.
Example:
I want to be able to tell the container to return object a for every given
key between 0 and 10, object c for every key between 11 and 500000 and
object c for every key between 500001 and 599999, without having to
individually define all the 600000 values and of course without needing
600000 times whatever the size of the key+value pairs is of memory.
(The ranges are not supposed to have gaps between them, btw.)
Before I roll my own, I'd like to know if there is already a well-accepted
and tested solution out there. I didn't find anything in Boost.
I don't know. I think someone asked about something similar recently in
either this group or comp.lang.c++.moderated. I think the best answer
was something like this, which might help point you in the right
direction. I don't claim this is great code, and it's certainly not
ready for production.
HTH.
#include <iostream>
#include <map>
#include <string>
typedef std::map<unsigned int, std::string> XMap;
typedef std::pair<XMap::const_iterator, XMap::const_iterator> XMapCIPair;
typedef std::pair<XMap::key_type, XMap::key_type> XMapKeyPair;
std::ostream &operator<<(std::ostream &o, const XMap::value_type &v) {
o << "[" << v.first << "] = \"" << v.second << "\"";
return o;
}
std::ostream &operator<<(std::ostream &o, const XMapCIPair &i) {
for(XMap::const_iterator j=i.first; j!=i.second; j++) {
o << *j << std::endl;
}
return o;
}
XMapCIPair range(const XMap &m, const XMapKeyPair &keypair) {
return XMapCIPair(m.lower_bound(keypair.first),
m.upper_bound(keypair.second));
}
int main() {
XMap m;
m[0] = "hello";
m[1] = "world";
m[2] = "this";
m[40] = "and";
m[41] = "that";
m[50] = "the";
m[51] = "other";
m[52] = "thing";
std::cout << "all of the map" << std::endl;
std::cout << XMapCIPair(m.begin(),m.end()) << std::endl;
static const XMapKeyPair test[] = {
XMapKeyPair(0,99),
XMapKeyPair(0,1),
XMapKeyPair(1,2),
XMapKeyPair(2,3),
XMapKeyPair(0,10),
XMapKeyPair(2,41),
XMapKeyPair(3,40),
XMapKeyPair(3,3),
XMapKeyPair(99,99),
XMapKeyPair(40,40),
};
for(unsigned int i=0; i<sizeof(test)/sizeof(test[0]); i++) {
const XMapKeyPair &t = test[i];
std::cout << i << "** trying " << t.first << " " << t.second <<
std::endl;
std::cout << range(m,t) << std::endl;
}
}
LR