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

Posted

技术标签:

【中文标题】第二部分:编写两个函数来反转 vect<int> 中元素的顺序【英文标题】:Second part to: write two functions that reverse the order of the elements in a vect<int> 【发布时间】:2015-10-29 23:34:27 【问题描述】:

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

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

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

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

但是当我将 testing.size() 除以 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);

【问题讨论】:

std::reverse(numbers.begin(), numbers.end());easy。 cppreference 还显示了“可能的实现” 这对未来的项目很有用。谢谢。 【参考方案1】:

要反转矢量,您需要交换它的两半。如果将其两半交换两次,您将再次获得原始向量。

所以这个循环

for (int i = 0; i < testing.size(); i++) 


    swap(testing[i], testing[testing.size() - 1 - i]);

 

i &lt; testing.size() / 2 时交换两半,然后当i &gt;= 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(下半部分)的每个元素与索引大于或等于testing.size() / 2(上半部分)的每个元素交换

你可以用一个语句编写函数

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

在标头&lt;algorithm&gt; 中声明了一个标准算法,其作用相同

#include <algorithm>

//...

std::reverse( testing.begin(), testing.end() );

【讨论】:

谢谢!我能够按时完成作业。我们还没有学过reverse(),好像老师只希望我们使用我们已经看过的代码。但从现在开始,我会牢记这一点。【参考方案2】:

仅出于说明目的,以下是您的程序示例运行中发生的情况。 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() 时,您交换的所有元素都已交换回其原始位置!

【讨论】:

谢谢!我更像是一个视觉学习者。因此,借助您的视觉辅助和弗拉德的回答,我能够得到它。【参考方案3】:

这是因为如果您有 (i

【讨论】:

以上是关于第二部分:编写两个函数来反转 vect<int> 中元素的顺序的主要内容,如果未能解决你的问题,请参考以下文章

第六次实验报告第二部分

[redis读书笔记] 第二部分 集群

读书笔记-HBase in Action-第二部分Advanced concepts-Coprocessor

用C语言来编写:商品销售统计程序

POJ 1002 487-3279

UEFI.源码分析.DXE的内存服务.第二部分.函数接口