作为程序的一部分,我试图以相反的顺序打印数组的内容。除了一个值,它工作正常,我无法弄清楚为什么。
我还没有进入功能,所以我没有在我的代码中使用它们这里是片段
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
任何帮助表示赞赏
答案 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}}