i have function reads ~10000 words vector, want group words map 'count' how many times word appears.
while code 'works' can take 2 seconds re-build map.
nb: unfortunately, cannot change 'read' function, have work vector of std::u16string
.
std::vector<std::u16string> vvalues; vvalues.push_back( ... ) ... std::map<std::u16string, int> mvalues; for( auto = vvalues.begin(); != vvalues.end(); ++it ) { if( mvalues.find( *it ) == mvalues.end() ) { mvalues[*it] = 1; } else { ++mvalues[*it]; } }
how speed 'group by' while keeping track of number of times word appears in vector?
if call std::map::operator[]
on new key, value of key value initialized (to 0 pods int
). so, loop can simplified to:
for (auto = vvalues.begin(); != vvalues.end(); ++it) ++mvalues[*it];
if there no key *it
, default value 0
, incremented immediately, , becomes 1
.
if key exists, incremented.
furthermore, doesn't need map ordered, can use std::unordered_map
instead, insertion average constant time, instead of logarithmic, speed further.
Comments
Post a Comment