第二部分:编写两个函数来反转 vect <int>中元素的顺序

Second part to: write two functions that reverse the order of the elements in a vect<int>

本文关键字:vect lt int gt 顺序 元素 函数 两个 第二部分      更新时间:2023-10-16

首先,我知道有人问了以下问题。然而,他们没有问第二部分。第二部分我需要帮助。

编写两个函数,使向量中元素的顺序相反。例如,1,3,5,7,9变为9,7,5,3.1。第二个反向函数应该使用任何其他向量来反向其向量w/o的元素。(提示:交换)。

但是当我测试我的代码时。它不会通过以下循环颠倒顺序:

for (int i = 0; i < testing.size(); i++) 
    swap(testing[i], testing[testing.size() - 1 - i]);

但是当我把testing.size()除以2时。它工作得很好。所以我的问题是:当它除以2时,为什么它能起作用。我找了很多时间,甚至试着把它画出来。

for (int i = 0; i < testing.size()/2; i++) 
    swap(testing[i], testing[testing.size() - 1 - i]);

提前感谢!

以下是整个编码:

void replacing(vector<int>& testing)
{
    for (int i = 0; i < testing.size(); i++)
        cout << "original " << testing[i] << "n";
    for (int i = 0; i < testing.size(); i++)
        swap(testing[i], testing[testing.size() - 1 - i]);
    for (int i = 0; i < testing.size(); i++) 
        cout << "reversed " << testing[i] << "n";
}
int main()
{
    vector<int> original;
    int numbers;
    cout << "Enter random numbers: n";
    while (cin >> numbers) 
        original.push_back(numbers);
    replacing(original);
}

若要反转向量,需要交换其两半。如果你把它的两半交换两次,你会再次得到原始向量。

所以这个循环

for (int i = 0; i < testing.size(); i++) 
{
    swap(testing[i], testing[testing.size() - 1 - i]);
} 

i < testing.size() / 2时交换两半,然后当i >= testing.size() / 2再次交换这两半以恢复向量的原始次序时交换两半。

所以一个正确的循环看起来像

for ( std::vector<int>::size_type i = 0; i < testing.size() / 2; i++ ) 
{
    swap( testing[i], testing[testing.size() - 1 - i] );
} 

在这种情况下,将索引小于testing.size() / 2(下半部分)的每个元素与索引gretaer大于或等于testing.size() / 2(上半部分)的每个元素进行交换

您可以用一条语句编写函数

testing.assign( testing.rbegin(), testing.rend() );

此外,在报头<algorithm>中声明了一种标准算法,该算法执行相同的

#include <algorithm>
//...
std::reverse( testing.begin(), testing.end() );

为了便于说明,下面是程序示例运行中发生的情况。i向右移动,size() - 1 - i(称为j)向左移动:

1 2 3 4 5 6
i         j
6 2 3 4 5 1
  i     j
6 5 3 4 2 1
    i j
6 5 4 3 2 1
    j i

您的循环应该停止在这里,因为i已经超过了size() / 2。现在观看:

6 5 3 4 2 1
    j i
6 2 3 4 5 1
  j     i
1 2 3 4 5 6
j         i

i到达size()时,它实际上停止在这里,因此您交换的所有元素都已交换回其原始位置!

这是因为如果您有(i<testing.size()),您将首先切换所有数字,但之后只需将所有数字切换回最初的位置。因此,如果你有一个值为{0,1,2,3}的向量,你将用3切换0,用2切换1,然后它将继续,并用2切换回1,用0切换回3,以再次生成{0,1,2.3}。当你把它除以2时,它在开始把数字切换回最初的值之前就停止了,你得到了你想要的向量。