Saturday, December 15, 2007

std::transform

I've heard people talking about the std::transform functions for ages, but I didn't really get around to exploring them until recently. What they bring to the table is a compact yet powerful way of performing a batch operations on stl containers, much like matlab's matrix math routines but with way more potential. You can perform common vector arithmetic such as addition, subtraction etc. but also select certain components of a container, such as the routine below that in one single line prints all the hash values of a std::map. Furthermore, by writing your code in std::transform notation you're very likely unleashing a higher degree of optimization potential in your compilers, both current and future ones. For example, the Intel compiler (I'm running 9.1 atm) immediately starts spewing out "LOOP WAS AUTO-PARALLELIZED" all over the place, which generally hasn't been too common a sight for me in the past.

Now for a couple examples, copied straight from http://www.sgi.com/tech/stl/ :

Print all of a map's keys.
int main()
{
map M;
M[1] = 0.3;
M[47] = 0.8;
M[33] = 0.1;

transform(M.begin(), M.end(), ostream_iterator(cout, " "),
select1st<map::value_type>());
// The output is 1 33 47.
}
Each element in V3 will be the difference of the corresponding elements in V1 and V2
const int N = 1000;
vector V1(N);
vector V2(N);
vector V3(N);

iota(V1.begin(), V1.end(), 1);
fill(V2.begin(), V2.end(), 75);

assert(V2.size() >= V1.size() && V3.size() >= V1.size());
transform(V1.begin(), V1.end(), V2.begin(), V3.begin(),
minus());

Friday, December 14, 2007

The stuff of legend

So I haven't posted anything in the longest of times but today I just have to break this unintentional silence; my co-worker Nafees (bin Zafar) just walked into our cubicle with the biggest smile on his face, eyes gleaming. In his hand was a letter from the Academy of Motion Picture Arts and Sciences. It turns out he, Doug Roble and Ryo Sakaguchi have scored a Scientific & Technical Achievement Award for our internal fluid simulator FSIM! For those of you who don't know, it was one of the first fluid simulators ever to be used in a feature film - check out the flooding of Bruinen in "The Lord of the Rings: The Fellowship of the Ring" (it's the one where the ringwraiths get their asses wooped out in the river). While FSIM has seen substantial improvements over the years it remains based on their original work, and this award serves to emphasize how groundbreaking that was. So although many of these guys seldom or never turn to alcohol for comfort or joy, I just might have to get hammered tonight in their honor. Celebration!