diff options
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.cpp | 94 |
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; +} +//] |