Species format_species(const Species& sp) { unit_species_comparerator comp(sp); std::vector<unit_species_comparerator::index_type> units; for (unit_species_comparerator::index_type i(0); i < sp.num_units(); ++i) { units.push_back(i); } std::sort(units.begin(), units.end(), comp); std::vector<unit_species_comparerator::index_type> next(sp.num_units(), sp.num_units()); unsigned int stride(0); for (unit_species_comparerator::index_type i(0); i < sp.num_units(); ++i) { const unit_species_comparerator::index_type idx(units[i]); comp.reorder_units(next, idx, stride); } for (unsigned int i(0); i < sp.num_units(); ++i) { units[next[i]] = i; } Species newsp; utils::get_mapper_mf<std::string, std::string>::type cache; stride = 1; std::stringstream ss; for (std::vector<unit_species_comparerator::index_type>::const_iterator i(units.begin()); i != units.end(); ++i) { UnitSpecies usp(sp.at(*i)); for (UnitSpecies::container_type::size_type j(0); j < static_cast<UnitSpecies::container_type::size_type>(usp.num_sites()); ++j) { UnitSpecies::container_type::value_type& site(usp.at(j)); if (site.second.second == "" || is_wildcard(site.second.second)) { continue; } utils::get_mapper_mf<std::string, std::string>::type::const_iterator it(cache.find(site.second.second)); if (it == cache.end()) { ss << stride; cache.insert(std::make_pair(site.second.second, ss.str())); site.second.second = ss.str(); ++stride; ss.clear(); ss.str(""); } else { site.second.second = (*it).second; } } newsp.add_unit(usp); } return newsp; }