diff --git a/docs/ProgrammersManual.html b/docs/ProgrammersManual.html index 46077b82d42..115e9133e19 100644 --- a/docs/ProgrammersManual.html +++ b/docs/ProgrammersManual.html @@ -884,15 +884,18 @@ this, providing various trade-offs.

-

If you intend to insert a lot of elements, then do a lot of queries, one -great approach is to use a vector (or other sequential container), and then use +

If you intend to insert a lot of elements, then do a lot of queries, a +great approach is to use a vector (or other sequential container) with std::sort+std::unique to remove duplicates. This approach works really well if -your usage pattern has these two distinct phases (insert then query), and, -coupled with a good choice of sequential container -can provide the several nice properties: the result data is contiguous in memory -(good for cache locality), has few allocations, is easy to address (iterators in -the final vector are just indices or pointers), and can be efficiently queried -with a standard binary search.

+your usage pattern has these two distinct phases (insert then query), and can be +coupled with a good choice of sequential container. +

+ +

+This combination provides the several nice properties: the result data is +contiguous in memory (good for cache locality), has few allocations, is easy to +address (iterators in the final vector are just indices or pointers), and can be +efficiently queried with a standard binary or radix search.

@@ -983,7 +986,7 @@ elements.

std::set is a reasonable all-around set class, which is good at many things -but great at nothing. std::set use a allocates memory for every single element +but great at nothing. std::set allocates memory for each element inserted (thus it is very malloc intensive) and typically stores three pointers with every element (thus adding a large amount of per-element space overhead). It offers guaranteed log(n) performance, which is not particularly fast.