считаютКак можно оптимизировать оператор сложения для контейнера класса C++?
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));
}
};
Я думаю, лучше реализация может быть
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));
}
То, что я хотел бы достичь в том, что, если у меня есть заявление, например,
S = A+B+C+D+E
и предположим, что B
, C
и D
пустые расходы должны быть такими же, как
S = A+E
По существу, я не хочу брать на себя расходы, если abc
тип равен нулю. Есть ли способ достичь этого?
Да, вы используете тот факт, что временные объекты не уничтожаются до конца полного выражения. Таким образом, вы делаете 'operator + (..., ...)' возвращаете прокси-объект, который просто ссылается на объекты. Пусть прокси-серверы «concat-able» с самим собой и вашим объектом «operator + (..., ...)». В последнем назначении из последнего созданного прокси вы делаете дополнение одним махом из всех, с которыми связаны прокси ... – WhiZTiM
@WhiZTim вы могли бы предоставить иллюстрацию или ссылку, чтобы показать эту технику? – user6386155