Generalization and abstraction are two of the fundamental bricks in building reusable code. When patterns of work are generalized, they can be captured as templates. They can then be tested thoroughly for the most general cases and set free as reusable components. The C++ algorithms, containers, function objects, and predicates work together to provide the developer with the tools necessary for generic programming. Although generic programming puts a higher burden on the supplier and producer of the component, it relieves a significant burden on the consumer of the component. This give-and-take between supplier and consumer ultimately improves the quality of available software.