我正在尝试制作一个基本上反转矢量序列的简单程序。换句话说,在程序运行后,x[0]
应该等于5
。我目前得到的输出是5234
。某处1
失踪了。我确实包含了<vector>
标题。提前谢谢。
int main()
{
vector<int> x(5);
x[0] = 1;
x[1] = 2;
x[2] = 3;
x[3] = 4;
x[4] = 5;
for(int z = 0; z < x.size()-1; z++)
{
int temp = x[x.size() - (1+z)];
x[x.size() - (1+z)] = x[z];
x[z] = temp;
}
for(int s = 0; s < x.size() - 1; s++)
{
cout << x[s] << endl;
}
return 0;
}
答案 0 :(得分:5)
退后一分钟。如果我只是放入swap(伪代码)
,你认为这会怎样?for( elt1 = begin, elt2 = end-1; elt1 != end; ++elt1, --elt2 )
{
iter_swap( elt1, elt2 );
}
这不会撤消您的收藏。或者更确切地说,它将会再次反转它,让你离开你的位置。假设您的收藏有4个要素:
swap( 0, 3 )
swap( 1, 2 )
swap( 2, 1 )
swap( 3, 0 )
所以你的终止条件是错误的,你只应该中途交换......
答案 1 :(得分:3)
你的循环是1个元素短。他们应该是
for(int z = 0; z < x.size(); ++z)
(s
的dtto。)
答案 2 :(得分:3)
答案 3 :(得分:1)
有几个人指出了如何使代码工作。我将指出如何在将来避免这个问题:不要编写代码(你自己):
std::vector<int> x(5);
std::iota(x.begin(), x.end(), 1);
std::reverse(x.begin(), x.end());
std::copy(x.begin(), x.end(),
std::ostream_iterator<int>(std::cout, "\n"));
像这样复制之前的反转是很常见的,标准有一个算法来组合这两个:
std::vector<int> x(5);
std::iota(x.begin(), x.end(), 1);
std::reverse_copy(x.begin(), x.end(),
std::ostream_iterator<int>(std::cout, "\n"));
根据具体情况,使用反向迭代器而不是reverse_copy可能更容易:
std::vector<int> x(5);
std::iota(x.begin(), x.end(), 1);
std::copy(x.rbegin(), x.rend(), std::ostream_iterator<int>(std::cout, "\n"));
请注意,在后两种情况下,我们正在做的事情略有不同 - 我们没有反转向量中的数据,然后从头到尾打印出向量。相反,我们只是以相反的顺序打印出向量,大致相当于:
for (int i=x.size(); i>0; i--)
std::cout << x[i-1] << "\n";
最后一个细节:我建议不要使用std::endl
。我知道很多书(以及教师,教师,教授等)都用它来代替“\ n”,但事实并非如此。除了编写新行之外,它还会刷新流。你几乎从不想要那个;在极少数情况下,你应该使用std::flush
来明确你真的想要它。如果你想换行,只需写一个换行符。
答案 4 :(得分:0)
你要两次交换元素。这是一个简单的方法:
vector<int> x(5);
x[0] = 1;
x[1] = 2;
x[2] = 3;
x[3] = 4;
x[4] = 5;
int mid = x.size() / 2;
int last = x.size() - 1;
for (int i = 0; i < mid; i++) {
int tmp = x[i];
x[i] = last - i;
x[last - i] = tmp;
}
for (int s = 0; s < x.size(); s++)
cout << x[s] << endl;