3

我正在尝试制作一个简单的程序,它基本上颠倒了向量的顺序。换句话说,程序运行后,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;
}
4

5 回答 5

5

退后一分钟。如果我只是输入交换,你认为这会做什么(伪代码)

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 )

所以你的终止条件是错误的,你应该只交换一半......

于 2012-11-23T11:43:20.110 回答
3

您的循环短 1 个元素。他们应该是

for(int z = 0; z < x.size(); ++z)

(dtto 为s)。

于 2012-11-23T11:36:17.937 回答
3

而不是编写代码来反转向量,您应该使用std::reverse算法?

http://www.cplusplus.com/reference/algorithm/reverse/

为什么要重新发明轮子?

于 2012-11-23T12:30:27.490 回答
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它来明确表示您确实想要它。如果你想要一个换行符,只需写一个换行符。

于 2012-11-23T12:26:35.087 回答
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;
于 2012-11-23T11:50:52.777 回答