Re: Initializing a map...
James Kanze wrote:
On Feb 21, 1:22 am, Jeff Schwab <j...@schwabcenter.com> wrote:
barcaroller wrote:
Is there a way in C++ to initialize an STL map in one
statement (the way arrays can be initialized in C)?
For example, instead of using:
map<type1,type2> mymap;
mymap[key1] = value1;
mymap[key2] = value2;
I would like to use something like:
// wrong syntax!
map<type1,type2> mymap = { (key1, value1), (key2, value2) };
There's no special syntax for maps.
I think there will be in the next version of the standard. (I
know that there was a proposal for extended initializers, but
I'm not sure what the current status of the proposal was.)
The proposal:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2215.pdf
I didn't know about that. Very neat. I'm not thrilled with g++ warning
me about:
std::tr1::array<int, 42> = { 0 }; // g++ wants { { 0 } }
It would bother me less if there were consistent syntax for primitive
and UD types.
You do have a few options, though.
One is to initialize an array with the nicer syntax, then initialize
the map from the array.
This is the only way to create a const map.
That's a very good point, and is the reason my "not really
initialization" solutions are inferior.
int main() {
pair_type initializers[] =
{ pair_type(key1, value1), pair_type(key2, value2) };
map_type m(initializers, initializers + size(initializers));
}
I often find it worthwhile to define a special structure for
this, something along the lines of:
typedef std::map< std::string, double > Map ;
struct MapInit
{
char const* key ;
double value ;
operator Map::value_type() const
{
return Map::value_type( std::string( key ), value ) ;
}
} ;
Is the key stored as a char const* so that construction of the
initializers does not require any run-time overhead? Does MapInit count
as a POD type, and is there benefit to using POD initializers?