forked from boostorg/unordered
https://svn.boost.org/svn/boost/branches/unordered/dev ........ r41993 | danieljames | 2007-12-13 00:23:27 +0000 (Thu, 13 Dec 2007) | 3 lines Add the hash documentation to the unordered library so that it'll be easier to link between the libraries. ........ r42104 | danieljames | 2007-12-16 13:36:50 +0000 (Sun, 16 Dec 2007) | 1 line Don't include any hash source in tarballs (although I'm including the documentation). ........ r42198 | danieljames | 2007-12-20 10:49:10 +0000 (Thu, 20 Dec 2007) | 1 line Restore the extra warnings in the unit tests. ........ r42199 | danieljames | 2007-12-20 11:25:38 +0000 (Thu, 20 Dec 2007) | 1 line Make a cast explicit in order to avoid a warning. ........ r42203 | danieljames | 2007-12-20 15:54:31 +0000 (Thu, 20 Dec 2007) | 1 line Use 'BOOST_UNORDERED' prefix for macros. ........ r42209 | danieljames | 2007-12-20 19:41:17 +0000 (Thu, 20 Dec 2007) | 1 line Initialise this branch (hopefully..) ........ r42210 | danieljames | 2007-12-20 19:51:21 +0000 (Thu, 20 Dec 2007) | 1 line Merge in changes. ........ r42215 | danieljames | 2007-12-20 21:15:42 +0000 (Thu, 20 Dec 2007) | 1 line Don't add size_type to pointers, cast to difference_type. ........ r42216 | danieljames | 2007-12-20 21:17:38 +0000 (Thu, 20 Dec 2007) | 1 line I messed up the last commit, this fixes it. ........ r42218 | danieljames | 2007-12-20 21:22:20 +0000 (Thu, 20 Dec 2007) | 1 line Get rid of last_in_group. ........ r42219 | danieljames | 2007-12-20 21:27:46 +0000 (Thu, 20 Dec 2007) | 1 line Use node_count to implement group_count. ........ r42231 | danieljames | 2007-12-21 12:04:52 +0000 (Fri, 21 Dec 2007) | 1 line Some minor changes for Visual C++. ........ r42233 | danieljames | 2007-12-21 19:41:27 +0000 (Fri, 21 Dec 2007) | 1 line Inline some more methods. ........ r42335 | danieljames | 2007-12-29 13:14:45 +0000 (Sat, 29 Dec 2007) | 3 lines Some of the changes to the introduction mention in the review. Hopefully this will make it a little clearer. ........ r42336 | danieljames | 2007-12-29 13:16:55 +0000 (Sat, 29 Dec 2007) | 3 lines Try to make the buckets explanation a little easier to read. Most of the changes were based on Jamie Allsop (same for the last commit). ........ r42339 | danieljames | 2007-12-29 16:00:32 +0000 (Sat, 29 Dec 2007) | 1 line Specify the namespace for 'std::out_of_range' in the reference documentation. ........ r42345 | danieljames | 2007-12-29 20:41:10 +0000 (Sat, 29 Dec 2007) | 8 lines Rewrite much of the 'controlling the number of buckets' section. I'm trying to make it clearer. It's a bit tricky as the standard doesn't guarantee much. Instead of diving straight into the details I have tried to give the reader a rough idea of what 'rehash' does and what the load factor is. This is hopefully enough to understand the more detailled discussion of how you can control the number of buckets. Then finally I discuss iterator invalidation. ........ r42346 | danieljames | 2007-12-29 20:52:22 +0000 (Sat, 29 Dec 2007) | 1 line Move the table summarizing methods for controlling bucket size next to the discussion of these methods. The paragraphs about insert and invalidating iterator moves on to something else. ........ r42348 | danieljames | 2007-12-29 20:55:30 +0000 (Sat, 29 Dec 2007) | 1 line Fix the badly marked up bullet points. ........ r42349 | danieljames | 2007-12-29 20:57:53 +0000 (Sat, 29 Dec 2007) | 2 lines We now have cbegin and cend for local iterators. ........ [SVN r42403]
118 lines
4.1 KiB
Plaintext
118 lines
4.1 KiB
Plaintext
[/ Copyright 2006-2007 Daniel James.
|
|
/ Distributed under the Boost Software License, Version 1.0. (See accompanying
|
|
/ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ]
|
|
|
|
[def __tr1__
|
|
[@http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1836.pdf
|
|
C++ Standard Library Technical Report]]
|
|
[def __boost-tr1__
|
|
[@http://www.boost.org/doc/html/boost_tr1.html
|
|
Boost.TR1]]
|
|
[def __draft__
|
|
[@http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2007/n2461.pdf
|
|
Working Draft of the C++ Standard]]
|
|
[def __hash-table__ [@http://en.wikipedia.org/wiki/Hash_table
|
|
hash table]]
|
|
[def __hash-function__ [@http://en.wikipedia.org/wiki/Hash_function
|
|
hash function]]
|
|
|
|
[section:intro Introduction]
|
|
|
|
For accessing data based on key lookup, the C++ standard library offers `std::set`,
|
|
`std::map`, `std::multiset` and `std::multimap`. These are generally
|
|
implemented using balanced binary trees so that lookup time has
|
|
logarithmic complexity. That is generally okay, but in many cases a
|
|
__hash-table__ can perform better, as accessing data has constant complexity,
|
|
on average. The worst case complexity is linear, but that occurs rarely and
|
|
with some care, can be avoided.
|
|
|
|
Also, the existing containers require a 'less than' comparison object
|
|
to order their elements. For some data types this is impossible to implement
|
|
or isn't practical. In contrast, a hash table only needs an equality function
|
|
and a hash function for the key.
|
|
|
|
With this in mind, the __tr1__ introduced the unordered associative containers,
|
|
which are implemented using hash tables, and they have now been added to the
|
|
__draft__.
|
|
|
|
This library supplies an almost complete implementation of the specification in
|
|
the __draft__, (it doesn't support `emplace` yet, see the [link
|
|
unordered.rationale.future_developments Implementation Rationale] section for more
|
|
details). If accepted the containers should also be added to __boost-tr1__.
|
|
|
|
`unordered_set` and `unordered_multiset` are defined in the header
|
|
<[headerref boost/unordered_set.hpp]>
|
|
|
|
namespace boost {
|
|
template <
|
|
class Key,
|
|
class Hash = ``[classref boost::hash]``<Key>,
|
|
class Pred = std::equal_to<Key>,
|
|
class Alloc = std::allocator<Key> >
|
|
class ``[classref boost::unordered_set unordered_set]``;
|
|
|
|
template<
|
|
class Key,
|
|
class Hash = ``[classref boost::hash]``<Key>,
|
|
class Pred = std::equal_to<Key>,
|
|
class Alloc = std::allocator<Key> >
|
|
class ``[classref boost::unordered_multiset unordered_multiset]``;
|
|
}
|
|
|
|
`unordered_map` and `unordered_multimap` are defined in the header
|
|
<[headerref boost/unordered_map.hpp]>
|
|
|
|
namespace boost {
|
|
template <
|
|
class Key, class Mapped,
|
|
class Hash = ``[classref boost::hash]``<Key>,
|
|
class Pred = std::equal_to<Key>,
|
|
class Alloc = std::allocator<Key> >
|
|
class ``[classref boost::unordered_map unordered_map]``;
|
|
|
|
template<
|
|
class Key, class Mapped,
|
|
class Hash = ``[classref boost::hash]``<Key>,
|
|
class Pred = std::equal_to<Key>,
|
|
class Alloc = std::allocator<Key> >
|
|
class ``[classref boost::unordered_multimap unordered_multimap]``;
|
|
}
|
|
|
|
If using Boost.TR1, these classes will be included from `<unordered_set>` and
|
|
`<unordered_map>`, with the classes included in the `std::tr1` namespace.
|
|
|
|
The containers are used in a similar manner to the normal associative
|
|
containers:
|
|
|
|
#include <``[headerref boost/unordered_map.hpp]``>
|
|
#include <cassert>
|
|
|
|
int main()
|
|
{
|
|
boost::unordered_map<std::string, int> x;
|
|
x["one"] = 1;
|
|
x["two"] = 2;
|
|
x["three"] = 3;
|
|
|
|
assert(x["one"] == 1);
|
|
assert(x["missing"] == 0);
|
|
}
|
|
|
|
But since the elements aren't ordered, the output of:
|
|
|
|
BOOST_FOREACH(map::value_type i, x) {
|
|
std::cout<<i.first<<","<<i.second<<"\n";
|
|
}
|
|
|
|
can be in any order. For example, it might be:
|
|
|
|
two,2
|
|
one,1
|
|
three,3
|
|
missing,0
|
|
|
|
There are other differences, which are listed in the
|
|
[link unordered.comparison Comparison with Associative Containers] section.
|
|
|
|
[endsect]
|