В учебном пособии по C ++ 5Ed в главе рассказывается о потоковых итераторах, которые он приводит в следующем примере (стр. 512):
int main(){
istream_iterator<Sales_item> item_iter(cin), eof;
ostream_iterator<Sales_item> out_iter(cout, "\n");
// store the first transaction in sum and read the next record
Sales_item sum = *item_iter++;
while (item_iter != eof) {
// if the current transaction (which is stored in item_iter) has the same ISBN
if (item_iter->isbn() == sum.isbn())
sum += *item_iter++; // add it to sum and read the next
transaction
else {
out_iter = sum; // write the current sum
sum = *item_iter++; // read the next transaction
}
}
out_iter = sum; // remember to print the last set of records
}
Работает нормально, но я заметил, что внутри цикла он делает то же самое дважды вif-statement
:
if (item_iter->isbn() == sum.isbn())
sum += *item_iter++; // add it to sum and read the next transaction
else {
out_iter = sum; // write the current sum
sum = *item_iter++; // read the next transaction
}
Почему бы ему не оптимизировать его, чтобы использовать только разыменование и приращение в одном выражении?Таким образом, только когда записи отличаются, напечатайте и независимо от приращения условия и отмены ссылки:
while (item_iter != eof) {
if (item_iter->isbn() != sum.isbn()) // instead of check for equality
out_iter = sum; // write the current sum
sum = *item_iter++; // read the next transaction
}
Это хорошая идея, или я должен придерживаться примера книги?Спасибо?