在第一次循环迭代中,it 指的是第一个元素,dec_pointer 是 8,所以你有:
-----------------------------------------
| 1 | 4 | 2 | 6 | 9 | 10 | 17 | 13 | 15 |
-----------------------------------------
^ ^
it it+8
如果您随后将 it 增加 1 并将 dec_pointer 减少 1 而不是 2,则在第二次迭代中,dec_pointer 现在是 7,您将拥有:
-----------------------------------------
| 1 | 4 | 2 | 6 | 9 | 10 | 17 | 13 | 15 |
-----------------------------------------
^ ^
it it+7
如果您随后将 it 增加 1 并将 dec_pointer 减少 1 而不是 2,则在第 3 次迭代中,dec_pointer 现在是 6,您将拥有:
-----------------------------------------
| 1 | 4 | 2 | 6 | 9 | 10 | 17 | 13 | 15 |
-----------------------------------------
^ ^
it it+6
等等。因此,如您所见,您使用it+dec_pointer 引用的last 值始终是相同的元素15。这就是为什么你必须将 dec_pointer 减 2 而不是 1 才能得到正确的结果:
-----------------------------------------
| 1 | 4 | 2 | 6 | 9 | 10 | 17 | 13 | 15 |
-----------------------------------------
^ ^ ^ ^ ^ ^
it | | | | it+8
| | | |
it+1 | | (it+1)+6
| |
it+2 (it+2)+4
话虽如此,我会建议一个替代且更简单的解决方案 - 使用来自 vec.crbegin() 的 reverse_iterator 来访问第二个值,而不是从 vec.cbegin() 偏移前向 iterator,例如:
#include <iostream>
#include <vector>
#include <string>
int main()
{
std::vector<int> vec{1,4,2,6,9,10,17,13,15};
auto last_it = vec.crbegin();
for(auto it = vec.cbegin(); it != vec.cend(); ++it, ++last_it)
{
int first_last = *it + *last_it;
std::cout << "Add First and Last Digit : " << first_last << std::endl;
}
return 0;
}
Online Demo
或者更简单,完全摆脱it循环迭代器:
#include <iostream>
#include <vector>
#include <string>
int main()
{
std::vector<int> vec{1,4,2,6,9,10,17,13,15};
auto last_it = vec.crbegin();
for(int first : vec)
{
int first_last = first + *last_it++;
std::cout << "Add First and Last Digit : " << first_last << std::endl;
}
return 0;
}
Online Demo