If you've worked with data that needs to be sorted according to many criterias, then you have probably struggled with using multiple containers and multiple sorting functions/algorithms. Scenarios include displaying data sorted in different views, such as, files according to size, name, change date, etc.
Here is an example of the very powerful boost multi index container. As the name implies it enables you to have multiple indices into your container, which enables you to look at it anyway you desire.
Read more about it, and find more examples here
#include <string>
#include <iostream>
#include <boost/multi_index_container.hpp>
#include <boost/multi_index/member.hpp>
#include <boost/multi_index/ordered_index.hpp>
using boost::multi_index::multi_index_container;
using boost::multi_index::ordered_non_unique;
using boost::multi_index::ordered_unique;
using boost::multi_index::indexed_by;
using boost::multi_index::member;
struct employee_entry
{
employee_entry( const std::string& first,
const std::string& last,
long id):
first_name_(first),
last_name_(last),
id_(id)
{}
std::string first_name_;
std::string last_name_;
long id_;
};
typedef multi_index_container<
employee_entry, indexed_by<
ordered_unique<member<employee_entry, std::string
, &employee_entry::first_name_> >
, ordered_non_unique<member<employee_entry, std::string
, &employee_entry::last_name_> >
, ordered_non_unique<member<employee_entry, long
, &employee_entry::id_> >
>
> employee_set;
//employee set.... multi-index
employee_set m_employees;
int main()
{
using boost::multi_index::nth_index;
using boost::multi_index::get;
typedef nth_index<employee_set, 0>::type first_name_view;
first_name_view& fnv = get<0>(m_employees);
fnv.insert(employee_entry("John", "Smith", 110));
fnv.insert(employee_entry("Fudge", "Hunk", 97));
fnv.insert(employee_entry("Tolem", "Bathi", 87));
fnv.insert(employee_entry("Anjal", "Sunfo", 75));
fnv.insert(employee_entry("Heidi", "Clark", 89));
///get employees sorted by id
typedef nth_index<employee_set, 2>::type id_view;
id_view& idv = get <2> (m_employees);
for(id_view::reverse_iterator it = idv.rbegin(), it_end(idv.rend()); it != it_end; ++it)
{
std::cout << it->first_name_ <<" "
<< it->last_name_ << ":"
<< it->id_ << std::endl;
}
const std::string str(40, '-');
std::cout << str << std::endl;
///get employees sorted by first name
typedef nth_index<employee_set, 0>::type fname_view;
fname_view& fdv = get <0> (m_employees);
for(fname_view::iterator it = fdv.begin(), it_end(fdv.end()); it != it_end; ++it)
{
std::cout << it->first_name_ <<" "
<< it->last_name_ << ":"
<< it->id_ << std::endl;
}
return 0;
}