betrachtenWie kann ein Additionsoperator für einen C++ - Klassencontainer optimiert werden?
class abc
{
public:
map<int,double> data;
abc(map<int,double> && in):data(std::move(in)){}
abc operator + (const abc & in)
{
auto tmp = data;
for(auto & itr : in.data)
tmp[itr.first] += itr.second;
return abc(std::move(tmp));
}
};
ich eine bessere Umsetzung erraten
abc operator + (const abc & in)
{
auto &tmp1 = (data.size() > in.data.size() ? data : in.data);
auto &tmp2 = (data.size() > in.data.size() ? in.data : data);
auto tmp = tmp1;
for(auto & itr : tmp2)
tmp[itr.first] += itr.second;
return abc(std::move(tmp));
}
könnte
Was ich erreichen möchte, dass, wenn ich eine Aussage zum Beispiel
S = A+B+C+D+E
und angenommen, B
, C
und sind leer, die Kosten sollten gleich sein wie
S = A+E
Im Wesentlichen möchte ich keine Kosten entstehen, wenn abc
Typ ist Null. Gibt es einen Weg, das zu erreichen?
Ja, Sie nutzen die Tatsache aus, dass Provisorien nicht bis zum Ende eines vollständigen Ausdrucks zerstört werden. Also machen Sie 'operator + (..., ...)' 'ein Proxy-Objekt, das einfach auf die Objekte verweist. Lassen Sie die Proxies mit sich selbst und Ihrem Objekt durch "Operator + (..., ...)" "begreifbar" sein. Bei der letzten Zuweisung von dem zuletzt erstellten Proxy machen Sie die Addition auf einen Schlag von allem, was die Proxys verbunden haben ... – WhiZTiM
@WhiZTim könnten Sie Illustration oder Link zur Verfügung stellen, um diese Technik zu zeigen? – user6386155