Connecting Tech Pros Worldwide Help | Site Map

Re: Is a std::map<> ordered?

Juha Nieminen
Guest
 
Posts: n/a
#1: Nov 20 '08
joseph cook wrote:
Quote:
A map is always sorted using std::less
Not always. By default, yes, but you can specify other comparators, eg:

std::map<int, int, std::greaterreversedMap;
acehreli@gmail.com
Guest
 
Posts: n/a
#2: Nov 20 '08

re: Re: Is a std::map<> ordered?


On Nov 20, 7:48*am, Juha Nieminen <nos...@thanks.invalidwrote:
Quote:
joseph cook wrote:
Quote:
A map is always sorted using std::less
>
* Not always. By default, yes, but you can specify other comparators, eg:
>
std::map<int, int, std::greaterreversedMap;
Or at runtime:

std::map<int, intmyMap(myPredicate);

Ali
Pete Becker
Guest
 
Posts: n/a
#3: Nov 20 '08

re: Re: Is a std::map<> ordered?


On 2008-11-20 14:40:19 -0500, acehreli@gmail.com said:
Quote:
On Nov 20, 7:48Â*am, Juha Nieminen <nos...@thanks.invalidwrote:
Quote:
>joseph cook wrote:
Quote:
>>A map is always sorted using std::less
>>
>Â* Not always. By default, yes, but you can specify other comparators, e
g:
Quote:
>>
>std::map<int, int, std::greaterreversedMap;
>
Or at runtime:
>
std::map<int, intmyMap(myPredicate);
>
Not really. There's a third type argument to std::map which specifies
the map's predicate type, with a default of std::less<T>. This
constructor takes an argument with the same type as the template's
predicate argument, so you can't pass arbitrary predicate objects. This
constructor is only useful with a user-defined predicate type that can
be initialized with something other than its default constructor.

--
Pete
Roundhouse Consulting, Ltd. (www.versatilecoding.com) Author of "The
Standard C++ Library Extensions: a Tutorial and Reference
(www.petebecker.com/tr1book)

Rolf Magnus
Guest
 
Posts: n/a
#4: Nov 21 '08

re: Re: Is a std::map<> ordered?


Pete Becker wrote:
Quote:
On 2008-11-20 14:40:19 -0500, acehreli@gmail.com said:
>
Quote:
>On Nov 20, 7:48 am, Juha Nieminen <nos...@thanks.invalidwrote:
Quote:
>>joseph cook wrote:
>>>A map is always sorted using std::less
>>>
>>Not always. By default, yes, but you can specify other comparators, e
>g:
Quote:
>>>
>>std::map<int, int, std::greaterreversedMap;
>>
>Or at runtime:
>>
> std::map<int, intmyMap(myPredicate);
>>
>
Not really. There's a third type argument to std::map which specifies
the map's predicate type, with a default of std::less<T>. This
constructor takes an argument with the same type as the template's
predicate argument, so you can't pass arbitrary predicate objects. This
constructor is only useful with a user-defined predicate type that can
be initialized with something other than its default constructor.
Well, basically that just does mean that it depends on a runtime value.
Otherwise, you wouldn't need those constructor arguments in the first place.


Juha Nieminen
Guest
 
Posts: n/a
#5: Nov 21 '08

re: Re: Is a std::map<> ordered?


acehreli@gmail.com wrote:
Quote:
std::map<int, intmyMap(myPredicate);
I don't think you can do that because the comparator template
parameter is set by default to std::less, and unless myPredicate casts
implicitly to type std::less, that won't work. You have to do it like:

std::map<int, int, MyPredicateTypemyMap(myPredicate);

If 'myPredicate' is a function, the syntax becomes awkward:

std::map<int, int, bool(*)(int, int)myMap(myPredicate);

This becomes even more awkward if the key and data types of the map
are something more complicated than int.

The next standard will offer a tool to alleviate the problem:

std::map<int, int, decltype(myPredicate)myMap(myPredicate);
Pete Becker
Guest
 
Posts: n/a
#6: Nov 21 '08

re: Re: Is a std::map<> ordered?


On 2008-11-21 06:34:27 -0500, Rolf Magnus <ramagnus@t-online.desaid:
Quote:
Pete Becker wrote:
>
Quote:
>On 2008-11-20 14:40:19 -0500, acehreli@gmail.com said:
>>
Quote:
>>On Nov 20, 7:48 am, Juha Nieminen <nos...@thanks.invalidwrote:
>>>joseph cook wrote:
>>>>A map is always sorted using std::less
>>>>
>>>Not always. By default, yes, but you can specify other comparators, e
>>g:
>>>>
>>>std::map<int, int, std::greaterreversedMap;
>>>
>>Or at runtime:
>>>
>>std::map<int, intmyMap(myPredicate);
>>>
>>
>Not really. There's a third type argument to std::map which specifies
>the map's predicate type, with a default of std::less<T>. This
>constructor takes an argument with the same type as the template's
>predicate argument, so you can't pass arbitrary predicate objects. This
>constructor is only useful with a user-defined predicate type that can
>be initialized with something other than its default constructor.
>
Well, basically that just does mean that it depends on a runtime value.
Otherwise, you wouldn't need those constructor arguments in the first place.
It means that std::map<int, intmyMap(myPredicate) is an error unless
the type of myPredicate is std::less<int>, in which cast it's
irrelevant. In particular, it is not a runtime replacement for
std::map<int, int, std::greater<int>>.

--
Pete
Roundhouse Consulting, Ltd. (www.versatilecoding.com) Author of "The
Standard C++ Library Extensions: a Tutorial and Reference
(www.petebecker.com/tr1book)

Pete Becker
Guest
 
Posts: n/a
#7: Nov 21 '08

re: Re: Is a std::map<> ordered?


On 2008-11-21 08:46:16 -0500, Juha Nieminen <nospam@thanks.invalidsaid:
Quote:
acehreli@gmail.com wrote:
Quote:
>std::map<int, intmyMap(myPredicate);
>
I don't think you can do that because the comparator template
parameter is set by default to std::less, and unless myPredicate casts
implicitly to type std::less, that won't work. You have to do it like:
>
std::map<int, int, MyPredicateTypemyMap(myPredicate);
>
If 'myPredicate' is a function, the syntax becomes awkward:
>
std::map<int, int, bool(*)(int, int)myMap(myPredicate);
Well, yes, and as we've seen in many Ginsu knife commercials, a normal
knife can't slice a tomato. The way to write this code is, of course,
with appropriate typedefs:

typedef bool (*pred)(int,int);
std::map<int, int, predmyMap(myPredicate);
Quote:
>
This becomes even more awkward if the key and data types of the map
are something more complicated than int.
Not at all. Again, typedefs.

--
Pete
Roundhouse Consulting, Ltd. (www.versatilecoding.com) Author of "The
Standard C++ Library Extensions: a Tutorial and Reference
(www.petebecker.com/tr1book)

Closed Thread