c ++向量反向算法

时间:2012-11-23 11:33:31

标签: c++

我正在尝试制作一个基本上反转矢量序列的简单程序。换句话说,在程序运行后,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;
}

5 个答案:

答案 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)

您应该使用std::reverse算法吗?

而不是编写代码来反转矢量

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

为什么重新发明轮子?

答案 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"));

根据具体情况,使用反向迭代器而不是rev​​erse_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;