summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/bimap/example/mi_to_b_path/hashed_indices.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/boost/libs/bimap/example/mi_to_b_path/hashed_indices.cpp')
-rw-r--r--src/boost/libs/bimap/example/mi_to_b_path/hashed_indices.cpp94
1 files changed, 94 insertions, 0 deletions
diff --git a/src/boost/libs/bimap/example/mi_to_b_path/hashed_indices.cpp b/src/boost/libs/bimap/example/mi_to_b_path/hashed_indices.cpp
new file mode 100644
index 000000000..22bb391b8
--- /dev/null
+++ b/src/boost/libs/bimap/example/mi_to_b_path/hashed_indices.cpp
@@ -0,0 +1,94 @@
+// Boost.Bimap
+//
+// Copyright (c) 2006-2007 Matias Capeletto
+//
+// 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)
+
+
+// Boost.Bimap Example
+//-----------------------------------------------------------------------------
+// Hashed indices can be used as an alternative to ordered indices when fast
+// lookup is needed and sorting information is of no interest. The example
+// features a word counter where duplicate entries are checked by means of a
+// hashed index.
+
+#include <boost/config.hpp>
+
+//[ code_mi_to_b_path_hashed_indices
+
+#include <iostream>
+#include <iomanip>
+
+#include <boost/tokenizer.hpp>
+
+#include <boost/bimap/bimap.hpp>
+#include <boost/bimap/unordered_set_of.hpp>
+#include <boost/bimap/multiset_of.hpp>
+#include <boost/bimap/support/lambda.hpp>
+
+using namespace boost::bimaps;
+
+struct word {};
+struct occurrences {};
+
+typedef bimap
+<
+
+ multiset_of< tagged<unsigned int,occurrences>, std::greater<unsigned int> >,
+unordered_set_of< tagged< std::string, word> >
+
+> word_counter;
+
+typedef boost::tokenizer<boost::char_separator<char> > text_tokenizer;
+
+int main()
+{
+
+ std::string text=
+ "Relations between data in the STL are represented with maps."
+ "A map is a directed relation, by using it you are representing "
+ "a mapping. In this directed relation, the first type is related to "
+ "the second type but it is not true that the inverse relationship "
+ "holds. This is useful in a lot of situations, but there are some "
+ "relationships that are bidirectional by nature.";
+
+ // feed the text into the container
+
+ word_counter wc;
+ text_tokenizer tok(text,boost::char_separator<char>(" \t\n.,;:!?'\"-"));
+ unsigned int total_occurrences = 0;
+
+ for( text_tokenizer::const_iterator it = tok.begin(), it_end = tok.end();
+ it != it_end ; ++it )
+ {
+ ++total_occurrences;
+
+ word_counter::map_by<occurrences>::iterator wit =
+ wc.by<occurrences>().insert(
+ word_counter::map_by<occurrences>::value_type(0,*it)
+ ).first;
+
+ wc.by<occurrences>().modify_key( wit, ++_key);
+ }
+
+ // list words by frequency of appearance
+
+ std::cout << std::fixed << std::setprecision(2);
+
+ for( word_counter::map_by<occurrences>::const_iterator
+ wit = wc.by<occurrences>().begin(),
+ wit_end = wc.by<occurrences>().end();
+
+ wit != wit_end; ++wit )
+ {
+ std::cout << std::setw(15) << wit->get<word>() << ": "
+ << std::setw(5)
+ << 100.0 * wit->get<occurrences>() / total_occurrences << "%"
+ << std::endl;
+ }
+
+ return 0;
+}
+//]