C ++ Primer 5 Edition: потоковые итераторы и Sales_item - PullRequest
1 голос
/ 24 сентября 2019

В учебном пособии по 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
}

Это хорошая идея, или я должен придерживаться примера книги?Спасибо?

1 Ответ

1 голос
/ 24 сентября 2019

Пожалуйста, придерживайтесь примера книги.Вы не проверили заявления точно.

В

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
}

заявления отличаются.

Пожалуйста, смотрите: sum += и sum =

Может быть, вы неправильно это поняли.

Ничего страшного.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...