简体   繁体   中英

C++ Printing Contents of array backwards One incorrect digit

As part of a program I'm trying to print the contents of an array in reverse order. It is working fine except for one value and I can't figure out why.

I haven't gotten onto functions yet so I haven't used them in my code here is the snippet

case 7:
    for (int i = 11; i != -1; i--)// The variable i is initialised to 11. While i is not equal to -1 decrement i by 1.
    {
        infile >> list[i];//Read in values for array from data.dat
        cout << list[i] << " ";// Outputting the array in reverse order.
        outfile << "The array in reverse order is: " << list[i] << " " << endl;// Outputting the array in reverse order to file.

    }
    cout << endl;
    break;

The array is filled with the following numbers

8 16 12 6 16 4 8 10 2 16 12 6

The expected output is:

6 12 16 2 10 8 4 16 6 12 16 8

The output I'm getting is:

6 12 16 2 10 8 4 16 6 12 6 8

Any help appreciated

The right way to reverse an iterator is to shift it down by one.

Forward:

T a[N];

for (std::size_t i = 0; i != N; ++i)
{
    consume(a[i]);
}

Backward:

T a[N];

for (std::size_t i = 0; i != N; ++i)
{
    std::size_t const ri = N - i - 1;
    //                           ^^^

    consume(a[ri]);
}

You can write a loop where you actually decrement the loop variable directly, but it's awkward since you either have to use signed integers or otherwise do an additional - 1 when using the index, and it's altogether unnatural, hard to read and easy to get wrong. I'd much rather recommend always using the forward-moving loop as shown here and compute the reverse iterator separately.

Incidentally, this logic is already encapsulated in the iterator wrapper std::reverse_iterator , which is build from a normal, bidirectional moving iterator but decrements by one when being dereferenced. You can either reverse a sequence yourself by using make_reverse_iterator , or by using the free rbegin / rend functions:

#include <iterator>

T a[N];

for (auto rit = std::crbegin(a); rit != std::crend(a); ++rit)
{
    consume(*rit);
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM