Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 第二部分:编写两个函数来反转向量中元素的顺序<;int>;_C++_Function_Vector - Fatal编程技术网

C++ 第二部分:编写两个函数来反转向量中元素的顺序<;int>;

C++ 第二部分:编写两个函数来反转向量中元素的顺序<;int>;,c++,function,vector,C++,Function,Vector,首先,我知道有人问了以下问题。但是,他们没有问第二部分。第二部分我需要帮助 编写两个函数,反转向量中元素的顺序。例如,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]); for(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]);
for(int i=0;i
但是当我将testing.size()除以2时。它工作得很好。所以我的问题是:当它被二除时,为什么它会起作用。我找了很多时间,甚至试着画出来

for (int i = 0; i < testing.size()/2; i++) 
    swap(testing[i], testing[testing.size() - 1 - i]);
for(int i=0;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);
}
void替换(向量和测试)
{
对于(int i=0;icout这是因为如果你有(i要反转向量,你需要交换它的两半。如果你交换两半,你将再次得到原始向量

所以这个循环

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

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

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

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

testing.assign( testing.rbegin(), testing.rend() );
还有一个在header
中声明的标准算法也执行相同的操作

#include <algorithm>

//...

std::reverse( testing.begin(), testing.end() );
#包括
//...
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()
时,它实际上停止在这里,此时您交换的所有元素都已交换回其原始位置!

std::reverse(numbers.begin(),numbers.end());
.cppreference还具有“可能的实现”这对将来的项目很有用。谢谢。谢谢!我能按时完成作业。我们还没有学习reverse()然而,老师似乎只想让我们使用我们已经复习过的代码。但从现在起我会记住这一点。谢谢!我更喜欢视觉学习。所以有了你的视觉帮助和Vlad的答案,我就能够理解了。
6 5 3 4 2 1
    j i

6 2 3 4 5 1
  j     i

1 2 3 4 5 6
j         i