第二部分:编写两个函数来反转 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 < 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
(下半部分)的每个元素与索引大于或等于testing.size() / 2
(上半部分)的每个元素交换
你可以用一个语句编写函数
testing.assign( testing.rbegin(), testing.rend() );
在标头<algorithm>
中声明了一个标准算法,其作用相同
#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> 中元素的顺序的主要内容,如果未能解决你的问题,请参考以下文章