void scalar_mul_and_add( const common::sfv_t& left, float s, common::sfv_t& right) { common::sfv_t::const_iterator l = left.begin(); common::sfv_t::iterator r = right.begin(); while (l != left.end() && r != right.end()) { if (l->first < r->first) { std::pair<std::string, float> p = *l; p.second *= s; r = right.insert(r, p); ++l; } else if (l->first > r->first) { ++r; } else { r->second += l->second * s; ++l; ++r; } } for (; l != left.end(); ++l) { std::pair<std::string, float> p = *l; p.second *= s; right.push_back(p); } }