From: Georg Bauhaus <bauhaus@futureapps.de>
Subject: Re: How to use associative arrays in Ada 2005?
Date: Fri, 24 Nov 2006 01:33:49 +0100
Date: 2006-11-24T01:33:45+01:00 [thread overview]
Message-ID: <1164328429.5590.61.camel@localhost.localdomain> (raw)
In-Reply-To: <1164310051.811802.237400@l12g2000cwl.googlegroups.com>
On Thu, 2006-11-23 at 11:27 -0800, snoopysalive wrote:
>
> The statement "Ages.Insert("family name",Insert("name",23));" doesn't
> work. So, how is it possible to do something like this in C++:
> "...
> map<string, map<string,int>> ages;
> ages["family name"]["name"] = 23;
> ..."
I think that in this case the Ada.Containers requirement
of being minimal building blocks applies. And probably also
the principle of query/command separation, which is not followed
by std::map::operator[]. [] does many things at the same time,
hence it is not minimal.
If I remember Matt's tutorial correctly, there is an example showing how
to manipulate items in containers in situ. Barnes' book has this, too.
If the elements in a map are containers themselves (or are
otherwise big), you may want to use Update_Element.
If you have +-----------+
+--> | ... |
+-------------+ | +-----------+
| ... | --+ | ... | +--> ...
+-------------+ +----------+ |
| family name | --> | ... | ---+
+-------------+ +----------+
| ... | | name | ------> 23
+----------+
| ... |
That is in order to manipulate one of the 2nd level maps,
you could either:
- Get the element at key "family name", which is a map.
This creates a copy of the map.
- Manipulate the copied map.
- Put the map back to where it had been (at key "family name"),
again copying.
Or,
- Get a cursor for the element at key "family name".
- Define a subprogram that manipulates the 2nd level map
(the one containing "name" as key).
- Call Update_Element with the cursor and the subprogram.
with Ada.Text_IO,
Ada.Strings.Hash,
Ada.Containers.Indefinite_Hashed_Maps;
use Ada.Text_IO,
Ada.Strings,
Ada.Containers;
procedure book2 is
package Str_Int_Maps is
new Ada.Containers.Indefinite_Hashed_Maps
(String,
Integer,
Ada.Strings.Hash,
"=");
use Str_Int_Maps;
package Str_Map_Maps is
new Ada.Containers.Indefinite_Hashed_Maps
(String,
Str_Int_Maps.Map,
Ada.Strings.Hash,
"=");
Ages : Str_Map_Maps.Map; -- That's the "hash of a hash"
Named_Age: Str_Int_Maps.Map;
-- life by population statistics:
Average: constant Natural := 80;
function Grow_Older(Now: Integer) return Integer is separate;
-- used to compute a new `Age` from `Now`
Age: Integer := 0;
procedure Set_Age(name: String; value: in out Str_Int_Maps.Map) is
begin
Named_Age.Include("name", Age); -- Note how `Age` is used here
end Set_Age;
begin
Ages.Insert("family name", Named_Age);
while Age < Average loop
Age := Grow_Older(Age);
--
Ages.Update_Element(position => Ages.Find("family name"),
process => Set_Age'access); -- in situ
end loop;
end book2;
This might seem like a lot, but once you have your setup, you
can reuse it, or write []-style wrappers, if you need them
etc.. Scope is important in this example, because the `Age`
variable is visible to Set_Age, and need not be passed around.
next prev parent reply other threads:[~2006-11-24 0:33 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-11-21 10:11 How to use associative arrays in Ada 2005? snoopysalive
2006-11-21 11:49 ` Georg Bauhaus
2006-11-21 14:18 ` Matthew Heaney
2006-11-21 23:35 ` snoopysalive
2006-11-23 19:27 ` snoopysalive
2006-11-23 19:40 ` Georg Bauhaus
2006-11-24 0:33 ` Georg Bauhaus [this message]
2006-11-24 11:49 ` Matthew Heaney
2006-11-24 8:27 ` Dmitry A. Kazakov
2006-11-24 11:51 ` Matthew Heaney
2006-11-26 19:05 ` snoopysalive
2006-11-26 20:30 ` Matthew Heaney
2006-11-27 9:15 ` Dmitry A. Kazakov
2006-11-27 19:53 ` Matthew Heaney
2006-11-27 21:11 ` Dmitry A. Kazakov
2006-11-27 21:52 ` Matthew Heaney
2006-11-28 8:29 ` Alex R. Mosteo
2006-11-28 13:19 ` Matthew Heaney
2006-11-28 8:34 ` Dmitry A. Kazakov
2006-11-28 13:21 ` Matthew Heaney
2006-11-27 21:08 ` Simon Wright
2006-11-27 22:22 ` Matthew Heaney
2006-11-27 22:58 ` Simon Wright
2006-11-28 1:55 ` Matthew Heaney
2006-11-24 11:35 ` Matthew Heaney
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox