void fill_range_strings() { boost::container::string model_s; model_s.append(sizeof(boost::container::string), '*'); //sorted_unique_range_int sorted_unique_range_string.resize(NElements); std::stringstream sstr; for(std::size_t i = 0, max = sorted_unique_range_string.size(); i != max; ++i){ sstr.str(std::string()); sstr << std::setfill('0') << std::setw(10) << i; sorted_unique_range_string[i] = model_s; const std::string &s = sstr.str(); sorted_unique_range_string[i].append(s.begin(), s.end()); } //sorted_range_string sorted_range_string = sorted_unique_range_string; sorted_range_string.insert(sorted_range_string.end(), sorted_unique_range_string.begin(), sorted_unique_range_string.end()); std::sort(sorted_range_string.begin(), sorted_range_string.end()); //random_range_string std::srand(0); random_range_string.assign(sorted_range_string.begin(), sorted_range_string.end()); std::random_shuffle(random_range_string.begin(), random_range_string.end()); //random_unique_range_string std::srand(0); random_unique_range_string.assign(sorted_unique_range_string.begin(), sorted_unique_range_string.end()); std::random_shuffle(random_unique_range_string.begin(), random_unique_range_string.end()); }
bool check_all_not_empty(boost::container::vector< std::pair<Iterator, Iterator > > &iterator_pairs) { for(std::size_t i = 0, max = iterator_pairs.size(); i != max; ++i){ if(iterator_pairs[i].first == iterator_pairs[i].second) return false; } return true; }
bool check_not_end(boost::container::vector<Iterator> &iterators, Iterator itend, std::size_t number_of_ends = 0) { std::size_t end_count = 0; for(std::size_t i = 0, max = iterators.size(); i != max; ++i){ if(iterators[i] == itend && (++end_count > number_of_ends) ) return false; } return true; }
void fill_range_ints() { //sorted_unique_range_int sorted_unique_range_int.resize(NElements); for(std::size_t i = 0, max = sorted_unique_range_int.size(); i != max; ++i){ sorted_unique_range_int[i] = static_cast<int>(i); } //sorted_range_int sorted_range_int = sorted_unique_range_int; sorted_range_int.insert(sorted_range_int.end(), sorted_unique_range_int.begin(), sorted_unique_range_int.end()); std::sort(sorted_range_int.begin(), sorted_range_int.end()); //random_range_int std::srand(0); random_range_int.assign(sorted_range_int.begin(), sorted_range_int.end()); std::random_shuffle(random_range_int.begin(), random_range_int.end()); //random_unique_range_int std::srand(0); random_unique_range_int.assign(sorted_unique_range_int.begin(), sorted_unique_range_int.end()); std::random_shuffle(random_unique_range_int.begin(), random_unique_range_int.end()); }
cpu_times search_time(boost::container::vector<typename C::value_type> &unique_range, const char *RangeType) { cpu_timer find_timer, lower_timer, upper_timer, equal_range_timer, count_timer; C c(unique_range.begin(), unique_range.end()); cpu_timer total_time; total_time.resume(); boost::container::vector<typename C::iterator> v_it(NElements); boost::container::vector< std::pair<typename C::iterator, typename C::iterator> > v_itp(NElements); for(std::size_t i = 0; i != NIter; ++i){ //Find { find_timer.resume(); for(std::size_t rep = 0; rep != 2; ++rep) for(std::size_t i = 0, max = unique_range.size(); i != max; ++i){ v_it[i] = c.find(unique_range[i]); } find_timer.stop(); if(!check_not_end(v_it, c.end())){ std::cout << "ERROR! find all elements not found" << std::endl; } } //Lower { lower_timer.resume(); for(std::size_t rep = 0; rep != 2; ++rep) for(std::size_t i = 0, max = unique_range.size(); i != max; ++i){ v_it[i] = c.lower_bound(unique_range[i]); } lower_timer.stop(); if(!check_not_end(v_it, c.end())){ std::cout << "ERROR! lower_bound all elements not found" << std::endl; } } //Upper { upper_timer.resume(); for(std::size_t rep = 0; rep != 2; ++rep) for(std::size_t i = 0, max = unique_range.size(); i != max; ++i){ v_it[i] = c.upper_bound(unique_range[i]); } upper_timer.stop(); if(!check_not_end(v_it, c.end(), 1u)){ std::cout << "ERROR! upper_bound all elements not found" << std::endl; } } //Equal { equal_range_timer.resume(); for(std::size_t rep = 0; rep != 2; ++rep) for(std::size_t i = 0, max = unique_range.size(); i != max; ++i){ v_itp[i] = c.equal_range(unique_range[i]); } equal_range_timer.stop(); if(!check_all_not_empty(v_itp)){ std::cout << "ERROR! equal_range all elements not found" << std::endl; } } //Count { std::size_t count = 0; count_timer.resume(); for(std::size_t rep = 0; rep != 2; ++rep) for(std::size_t i = 0, max = unique_range.size(); i != max; ++i){ count += c.count(unique_range[i]); } count_timer.stop(); if(count/2 != c.size()){ std::cout << "ERROR! count all elements not found" << std::endl; } } } total_time.stop(); std::cout << " Find " << RangeType << " " << boost::timer::format(find_timer.elapsed(), boost::timer::default_places, "%ws\n"); std::cout << " Lower Bound " << RangeType << " " << boost::timer::format(lower_timer.elapsed(), boost::timer::default_places, "%ws\n"); std::cout << " Upper Bound " << RangeType << " " << boost::timer::format(upper_timer.elapsed(), boost::timer::default_places, "%ws\n"); std::cout << " Equal Range " << RangeType << " " << boost::timer::format(equal_range_timer.elapsed(), boost::timer::default_places, "%ws\n"); std::cout << " Count " << RangeType << " " << boost::timer::format(count_timer.elapsed(), boost::timer::default_places, "%ws\n"); std::cout << " Total time = " << boost::timer::format(total_time.elapsed(), boost::timer::default_places, "%ws\n") << std::endl; return total_time.elapsed(); }