第二部分:编写两个函数来反转 vect <int>中元素的顺序
Second part to: write two functions that reverse the order of the elements in a vect<int>
首先,我知道有人问了以下问题。然而,他们没有问第二部分。第二部分我需要帮助。
编写两个函数,使向量中元素的顺序相反。例如,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时,它在开始把数字切换回最初的值之前就停止了,你得到了你想要的向量。
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- 如何显式调用运算符<<
- 模板操作员&lt;未打电话
- C / CUDA中的模板方法是3个角括号(&lt;&lt;&lt;)
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 错误:调用"std::vector<:vector<int>>::p ush_back(std::vector<std::__cxx11::basic_string<
- C 建造者Clang STD :: Sill,找不到超载的操作员&lt;
- 为什么STD :: MAP需要操作员&lt;以及我如何写一个
- 为什么“操作员”需要const但不是为“运营商&lt;”
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化
- 什么是模板&lt;&gt;inline bla bla
- 左角支架解释为操作员&lt;而不是模板参数
- that.vect.push_back(0) 中的错误和 .vect.begin() 中的错误"+" C++ 中的 orerator
- 编辑C Qlist&lt; object*&gt; gt;QML代码和一些QML警告中的模型
- 超载操作员&lt;&lt; - 必须是二进制操作员