<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 12pt;
font-family:Calibri
}
--></style></head>
<body class='hmmessage'><div dir='ltr'><div><span style="font-size: 12pt; ">The following is very efficient:</span></div><div><br></div><div><br></div><div>run through a bunch of records, picking out one number from some of them</div><div>append those numbers to a growing vector</div><div>sort the vector</div><div>unique the vector</div><div><br></div><div><br></div><div>sequence allows for random access..but only via a function...</div><div>or maybe an iterator</div><div><br></div><div><br></div><div>STL has this wonderful separation of algorithms from containers, via iterators.</div><div>I suspect very few other libraries do.</div><div>And it could be that most languages don't support it.</div><div>It doesn't appear I can easily sort a sequence, unless I copy the data out into an array -- gross inefficiency.</div><div><br></div><div><br></div><div>I've hacked something very manual together..and it is taking forever to get it to work.</div><div>  It turns out I can reasonably well bound the size of the data, so I'm using an open array...and I have to keep track of my position instead of using addhi/push_back.</div><div>Not happy.</div><div>At some point I might give up and write the backend in C++..at which point I might as well write a C++ frontend anywa.</div><div><br></div><div><br></div><div><br></div><div>I absolutely do not want a sorted table and unique upon insert.</div><div>That is much less efficient.</div><div>What I'm describing uses temporarily larger working set but vastly less CPU.</div><div>An array that gets sorted/uniqued occasionally, like just once.</div><div>And not ongoing maintainence for every single add.</div><div><br></div><div><br></div><div><br></div><div> - Jay</div><div><br><br><br><div><div id="SkyDrivePlaceholder"></div>> To: jay.krell@cornell.edu<br>> CC: m3devel@elegosoft.com<br>> Subject: Re: [M3devel] STL algorithms? sort/unique?<br>> Date: Fri, 28 Sep 2012 01:04:48 -0700<br>> From: mika@async.caltech.edu<br>> <br>> <br>> BTW I had the same experience when I first started using Modula-3.<br>> It was painful to jump through all its hoops, coming from C, where you<br>> can do whatever you want to whatever bits happen to be sloshing around<br>> your machine.  C++ from what I have seen mainly lets you do that to<br>> more bits in fewer lines of code.<br>> <br>> But after a while I really came to appreciate the value of things like the<br>> language's telling me I'm using the wrong data structure instead of<br>> just letting me use the same "nice, terse, efficient" syntax to write<br>> a crappy program :-)<br>> <br>> mika writes:<br>> >You're using the wrong (abstract) data structure if you want sort and unique.<br>> ><br>> >A "sequence" is meant to be accessed sequentially...<br>> ><br>> >Not knowing precisely what you're doing it sounds like you might want a<br>> >SortedTable... you can get unique on insert and access it in increasing<br>> >or decreasing order.<br>> ><br>> >    Mika<br>> ><br>> >Jay K writes:<br>> >>--_d2a02ece-d492-410e-88fb-fb53737d7219_<br>> >>Content-Type: text/plain; charset="iso-8859-1"<br>> >>Content-Transfer-Encoding: quoted-printable<br>> >><br>> >>    I have an IntSeq.T with a bunch of integers.   =20<br>> >>    What is a good terse efficient idiom for sort and unique?   =20<br>> >><br>> >>    In C++ I would say:        vector<int> a=3B        a.push_back(...)=3B =<br>> >>       a.push_back(...)=3B        std::sort(a.begin()=2C a.end())=3B       =<br>> >> a.resize(std::unique(a.begin()=2C a.end()) - a.begin())=3B        for (aut=<br>> >>o i =3D a.begin()=3B i !=3D a.end()=3B ++i)    {<br>> >>      do stuff with *i    }=20<br>> >>    Nice=2C terse=2C efficient.        In Modula-3?   =20<br>> >><br>> >>I know that unique is one of the easiest algorithms to manually write inlin=<br>> >>e=2Cbut I shouldn't have to.<br>> >><br>> >>(I'm really trying to stay in Modula-3 here=2C but it is definitely a strug=<br>> >>gle. :( )<br>> >><br>> >>Thank you=2C - Jay<br>> >><br>> >>                                    =<br>> >><br>> >>--_d2a02ece-d492-410e-88fb-fb53737d7219_<br>> >>Content-Type: text/html; charset="iso-8859-1"<br>> >>Content-Transfer-Encoding: quoted-printable<br>> >><br>> >><html><br>> >><head><br>> >><style><!--<br>> >>.hmmessage P<br>> >>{<br>> >>margin:0px=3B<br>> >>padding:0px<br>> >>}<br>> >>body.hmmessage<br>> >>{<br>> >>font-size: 12pt=3B<br>> >>font-family:Calibri<br>> >>}<br>> >>--></style></head><br>> >><body class=3D'hmmessage'><div dir=3D'ltr'>&nbsp=3B &nbsp=3B&nbsp=3BI have =<br>> >>an IntSeq.T with a bunch of integers.&nbsp=3B &nbsp=3B&nbsp=3B<br><div><spa=<br>> >>n style=3D"font-size: 12pt=3B ">&nbsp=3B &nbsp=3B</span><span style=3D"font=<br>> >>-size: 12pt=3B ">&nbsp=3B</span>What is a good terse efficient idiom for so=<br>> >>rt and unique?<span style=3D"font-size: 12pt=3B ">&nbsp=3B &nbsp=3B</span><=<br>> >>span style=3D"font-size: 12pt=3B ">&nbsp=3B</span></div><div><br></div><div=<br>> >>><br></div><div>&nbsp=3B &nbsp=3B In C++ I would say:<span style=3D"font-si=<br>> >>ze: 12pt=3B ">&nbsp=3B &nbsp=3B</span><span style=3D"font-size: 12pt=3B ">&=<br>> >>nbsp=3B</span></div><div><span style=3D"font-size: 12pt=3B ">&nbsp=3B &nbsp=<br>> >>=3B</span><span style=3D"font-size: 12pt=3B ">&nbsp=3B</span>vector&lt=3Bin=<br>> >>t&gt=3B a=3B<span style=3D"font-size: 12pt=3B ">&nbsp=3B &nbsp=3B</span><sp=<br>> >>an style=3D"font-size: 12pt=3B ">&nbsp=3B</span></div><div><span style=3D"f=<br>> >>ont-size: 12pt=3B ">&nbsp=3B &nbsp=3B</span><span style=3D"font-size: 12pt=<br>> >>=3B ">&nbsp=3B</span>a.push_back(...)=3B<span style=3D"font-size: 12pt=3B "=<br>> >>>&nbsp=3B &nbsp=3B</span><span style=3D"font-size: 12pt=3B ">&nbsp=3B</span=<br>> >>></div><div><div><span style=3D"font-size: 12pt=3B ">&nbsp=3B &nbsp=3B</spa=<br>> >>n><span style=3D"font-size: 12pt=3B ">&nbsp=3B</span>a.push_back(...)=3B<sp=<br>> >>an style=3D"font-size: 12pt=3B ">&nbsp=3B &nbsp=3B</span><span style=3D"fon=<br>> >>t-size: 12pt=3B ">&nbsp=3B</span></div><div><span style=3D"font-size: 12pt=<br>> >>=3B ">&nbsp=3B &nbsp=3B</span><span style=3D"font-size: 12pt=3B ">&nbsp=3B<=<br>> >>/span>std::sort(a.begin()=2C a.end())=3B<span style=3D"font-size: 12pt=3B "=<br>> >>>&nbsp=3B &nbsp=3B</span><span style=3D"font-size: 12pt=3B ">&nbsp=3B</span=<br>> >>></div><div><span style=3D"font-size: 12pt=3B ">&nbsp=3B &nbsp=3B</span><sp=<br>> >>an style=3D"font-size: 12pt=3B ">&nbsp=3B</span>a.resize(std::unique(a.begi=<br>> >>n()=2C a.end()) - a.begin())=3B<span style=3D"font-size: 12pt=3B ">&nbsp=3B=<br>> >> &nbsp=3B</span><span style=3D"font-size: 12pt=3B ">&nbsp=3B</span></div><d=<br>> >>iv><span style=3D"font-size: 12pt=3B ">&nbsp=3B &nbsp=3B for (auto i =3D a.=<br>> >>begin()=3B i !=3D a.end()=3B ++i)</span></div><div><span style=3D"font-size=<br>> >>: 12pt=3B ">&nbsp=3B &nbsp=3B {<br>&nbsp=3B &nbsp=3B &nbsp=3B do stuff with=<br>> >> *i</span></div><div><span style=3D"font-size: 12pt=3B ">&nbsp=3B &nbsp=3B =<br>> >>}</span></div><div>&nbsp=3B</div><div><br></div><div><span style=3D"font-si=<br>> >>ze: 12pt=3B ">&nbsp=3B &nbsp=3B</span><span style=3D"font-size: 12pt=3B ">&=<br>> >>nbsp=3B</span>Nice=2C terse=2C efficient.<span style=3D"font-size: 12pt=3B =<br>> >>">&nbsp=3B &nbsp=3B</span><span style=3D"font-size: 12pt=3B ">&nbsp=3B</spa=<br>> >>n></div><div><span style=3D"font-size: 12pt=3B ">&nbsp=3B &nbsp=3B</span><s=<br>> >>pan style=3D"font-size: 12pt=3B ">&nbsp=3B</span>In Modula-3?<span style=3D=<br>> >>"font-size: 12pt=3B ">&nbsp=3B &nbsp=3B</span><span style=3D"font-size: 12p=<br>> >>t=3B ">&nbsp=3B</span></div><div><br></div><div><br></div><div>I know that =<br>> >>unique is one of the easiest algorithms to manually write inline=2C</div><d=<br>> >>iv>but I shouldn't have to.</div><div><br></div><div><br></div><div>(I'm re=<br>> >>ally trying to stay in Modula-3 here=2C but it is definitely a struggle. :(=<br>> >> )</div><div><br></div><div><br></div><div>Thank you=2C</div><div>&nbsp=3B-=<br>> >> Jay</div><br><br></div>                                     </div></body><br>> >></html>=<br>> >><br>> >>--_d2a02ece-d492-410e-88fb-fb53737d7219_--<br></div></div>                                        </div></body>
</html>