Re: Resorting a map (copying a map to another with different Compare)
On Mar 11, 2:31 pm, Pete Becker <p...@versatilecoding.com> wrote:
nw wrote:
Hi,
I'd like to be able to re-sort a map (a curious aspiration perhaps). I
think basically what I'd like to do is copy one map into another that
uses a different Compare function. I was wondering if there was an
easy way of doing this in general. Or what strategy I could use to do
it?
I've tried something like this:
template<class map1_type,class map2_type>
void copy_map(map1_type &m1,map2_type &m2,int depth) {
if(depth > 0) {
map1_type::const_iterator i = m1.begin();
for(;i != m1.end();++i) {
copy_map(i,m2[i->first],depth-1);
}
} else {
map1_type::const_iterator i = m1.begin();
for(;i != m1.end();++i) {
m2[i->first] = m1[i->first];
}
}
}
But this fails to even compile. Does anyone have any ideas here?
In general, you can copy one map into another like this:
map2_type m2(m1.begin(), m1.end());
--
Pete
Roundhouse Consulting, Ltd. (www.versatilecoding.com) Author of
"The Standard C++ Library Extensions: a Tutorial and Reference"
(www.petebecker.com/tr1book)
So I think the problem is that in general I'm trying to do this with
maps containing maps e.g.:
#include <map>
#include <iostream>
using namespace std;
class numstr_compare {
public:
inline bool operator()(const string &k1,const string &k2) const {
std::cout << "numstr compare" << std::endl;
for(size_t n=0;n<k1.size();n++) { if(!(((k1[n] >= '0') && (k1[n]
<= '9')) || k1[n] == '.')) {return k1 < k2; std::cout << "strcomp1" <=
<
std::endl;} }
std::cout << "str: " << k1 << std::endl;
for(size_t n=0;n<k2.size();n++) { if(!(((k2[n] >= '0') && (k2[n]
<= '9')) || k2[n] == '.')) {return k1 < k2; std::cout << "strcomp2" <=
<
std::endl;} }
std::cout <<" str: " << k2 << std::endl;
if(k1.size() == 0) {return k1 < k2;}
if(k2.size() == 0) {return k1 < k2;}
float k1_double = atof(k1.c_str());
float k2_double = atof(k2.c_str());
return k1_double < k2_double;
}
};
int main() {
map<string,map<string,string> > m1;
m1["stuff"] = map<string,string>();
m1["astuff"] = map<string,string>();
m1["321"] = map<string,string>();
m1["432"] = map<string,string>();
m1["12323"] = map<string,string>();
m1["123"] = map<string,string>();
m1["1"] = map<string,string>();
map<string,map<string,numstr_compare>,numstr_compare>
m2(m1.begin(),m1.end());
}
Is there any neat solution here?