considèrentComment un opérateur d'addition pour un conteneur de classe C++ peut-il être optimisé?
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));
}
};
je suppose une meilleure mise en œuvre pourrait être
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));
}
Ce que je voudrais réaliser est que, si j'ai une déclaration, par exemple,
S = A+B+C+D+E
et supposons B
, C
et D
sont vides le coût devrait être identique àEssentiellement, je ne veux pas engager de coût si le type abc
est égal à 0. Y a-t-il un moyen d'y parvenir?
Oui, vous profitez du fait que les temporaires ne sont pas détruits jusqu'à la fin d'une expression complète. Donc vous faites 'operator + (..., ...)' renvoyer un objet proxy qui fait simplement référence aux objets. Laissez les proxies être "concat-able" avec eux-mêmes et votre objet par 'operator + (..., ...)'. Sur l'affectation finale du dernier proxy créé, vous faites l'addition en un seul coup de tout ce que les proxies ont lié ... – WhiZTiM
@WhiZTim pourriez-vous fournir une illustration ou un lien pour montrer cette technique? – user6386155