А так:
А так согласен, намного короче. Там правда mFriction float и после Append надо делать Clear - но не суть. Проходят и др ассоциативные контейнеры, для полноты вариант с std::map
C++ (Qt)
void CMesh::CreateShapes( TMeshPtrVec & mesh, TShapePtr & shape )
{
typedef std::map <float, CMesh *> TFrictionMap;
TFrictionMap fMap;
TFrictionMap::iterator it;
for (size_t i = 0; i < mesh.size(); ++i) {
CMesh * m = mesh[i];
it = fMap.find(m->mFriction);
if (it == fMap.end())
fMap.insert(std::make_pair(m->mFriction, m));
else {
it->second->Append(*m);
m->Clear();
}
}
for (it = fMap.begin(); it != fMap.end(); ++it)
shape.push_back(it->second->CreateShape());
}
Правда запрягается контейнер, но это допустимо/нормально.
По ходу дела (конечно это др. задача, но интересно): а если "нечеткое" совпадение ключа? Например нужно сливать CMesh если их mFriction отличается не более чем на заданный epsilon (напр 1.0e-5)
Спасибо