c++ - How to optimize binary search of a vector? -


i trying implement find method on sorted vector of key value pairs. right performing slower map.find(key). theoretically should faster because vector can take better advantage of cpu caching because of contiguous memory. i'm wondering if there wrong implementation , if there way can optimize it? don't think using standard algorithm option here, because closest possible option lower_bound , incur overhead of checks have perform verify whether or not found anything. beyond that, lower_bound require me construct pair (plus wrapper put around it) give value i'm searching for, incurring more unnecessary overhead.

flatmap<key, value, comparator>::findimp(const key_type &key) {     typename vectortype::iterator lower = d_elements.begin();     typename vectortype::iterator upper = d_elements.end();     typename vectortype::iterator middle;     while(lower < upper) {         middle = lower + (upper-lower)/2;         if(d_comparator(middle->data().first, key)){             lower = middle;             ++lower;         } else if(d_comparator(key, middle->data().first)){             upper = middle;         } else {             return middle;         }     }     return d_elements.end(); } 

note d_elements vector of pairs (the pairs in wrapper):

vector<flatmap_element<key, value> >  d_elements; 

the wrapper holds pair data member , magic assignment shouldn't affect search:

template <class key, class value> class flatmap_element {     bsl::pair<const key, value> d_data;     ...     pair<const key, value>& data();     pair<const key, value> const& data() const; }; 

i know business wrapper not source of slowdown, beaucse have tested algorithm on vector or pairs without wrapper , had same performance.

any suggestions tweaks appreciated.

your version use twice m_comparator result loop whereas std::lower_bound use 1 comparaison.

so may use like: (c++03)

template <typename key, typename value, typename keycomparator> struct helper_comp {     bool operator (const std::pair<const key, value>& lhs, const key& rhs) const {         return comp(lhs.first, rhs);     }     keycomparator comp; };  template <typename key, typename value, typename keycomparator> typename std::vector<std::pair<const key, value>>::const_iterator my_find(const std::vector<std::pair<const key, value>>& v, const key& key) {     auto = std::lower_bound(v.begin(), v.end(), key, helper_comp<key, value, keycomparator>());     if (it != v.end() && it->first == key) {         return it;     }     return v.end(); } 

or use lambda instead of external struct helper_comp(c++11) (https://ideone.com/snztru)


Comments

Popular posts from this blog

c++ - OpenCV Error: Assertion failed <scn == 3 ::scn == 4> in unknown function, -

php - render data via PDO::FETCH_FUNC vs loop -

The canvas has been tainted by cross-origin data in chrome only -