C ++打印向后的数组内容一个错误的数字

时间:2014-11-22 13:55:07

标签: c++ arrays

作为程序的一部分,我试图以相反的顺序打印数组的内容。除了一个值,它工作正常,我无法弄清楚为什么。

我还没有进入功能,所以我没有在我的代码中使用它们这里是片段

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;

数组中填充了以下数字

  

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

预期输出为:

  

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

我得到的输出是:

  

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

任何帮助表示赞赏

1 个答案:

答案 0 :(得分:0)

反转迭代器的正确方法是将其向下移动一个。

转发

T a[N];

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

<强>向后:

T a[N];

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

    consume(a[ri]);
}

可以编写一个实际上直接递减循环变量的循环,但它很笨拙,因为你要么必须使用有符号整数,要么在另外- 1时做另外的std::reverse_iterator使用索引,它完全不自然,难以阅读,容易出错。我建议总是使用这里所示的前移循环,并分别计算反向迭代器。

顺便提一下,这个逻辑已经封装在迭代器包装器rbegin中,它是从正常的双向移动迭代器构建的,但在被解除引用时会减1。您可以使用make_reverse_iterator或使用免费的rend / #include <iterator> T a[N]; for (auto rit = std::crbegin(a); rit != std::crend(a); ++rit) { consume(*rit); } 函数自行撤消序列:

{{1}}