使用嵌套for循环c++的反向数组

lmvvr0a8  于 2023-05-08  发布在  其他
关注(0)|答案(1)|浏览(163)

我一直在尝试做一些简单的事情,比如使用2个嵌套的for循环来反转数组,但我一直在这样做时遇到麻烦。

#include <iostream>

using namespace std;

int main() {
  int arr[] = {1,2,3};
  int index = 0;
  int length = sizeof(arr)/sizeof(arr[0]);
  int temp;

  // Before reverse
  cout<<endl;
  for (int j = 0; j < length; j++)
    {
      cout<<arr[j]<<" ";
    }

  for(int l = 0; l < length-index; l++)
    {
      // swap elements
      for(int i = 0; i < length-1; i++)
        {
          temp = arr[i];
          arr[i] = arr[i+1];
          arr[i+1] = temp;
        } 
      index++;
    }

  // After Reverse 
  cout<<endl;
  for (int k = 0; k < length; k++)
    {
      cout<<arr[k]<<" ";
    }

}

单独使用这个for循环,我可以得到第一个索引到末尾。然而,当我使用另一个for循环时,我尝试减少长度,这样第一个索引,被移动到末尾,就不会被移动,但它不起作用。第一个指数在年底继续移动,我不希望这种情况发生

for(int i = 0; i < length-1; i++)
        {
          temp = arr[i];
          arr[i] = arr[i+1];
          arr[i+1] = temp;
        }

请帮帮我

pnwntuvh

pnwntuvh1#

正如目前所写的,您的“反向”算法试图通过与相邻元素交换来使元素在数组中冒泡。这不仅效率很低,而且根本行不通。
你可以使用swap来反转数组,但是你应该从数组的每一端开始。例如,交换第一个和最后一个元素,然后交换第二个和倒数第二个元素,* 等等 *,直到到达数组的中间。

for(int left = 0, right = length - 1; left < right; left++, right--) {
    swap(arr[left], arr[right]);
}

这里我们只使用标准库的std::swap函数。这里没有使用名称空间限定符,因为您导入了整个std名称空间--这通常不是一个好主意,但没关系。
但是如果你可以使用标准库的swap,你也可以使用reverse!完整示例:

#include <algorithm>
#include <iostream>

// Write contents of array to stdout
template <typename T, std::size_t size>
void print(const T (&arr)[size]) {
    for (auto& x : arr) std::cout << x << " ";
    std::cout << "\n";
}

// Reverse an array
template <typename T, std::size_t size>
void reverse(T (&arr)[size]) {
    std::reverse(arr, arr + size);
}

int main() {
    int arr[] = { 1, 2, 3 };
    print(arr);
    reverse(arr);
    print(arr);
}

否则,实现您自己的swapreverse

#include <iostream>

// Write contents of array to stdout
template <typename T, std::size_t size>
void print(const T (&arr)[size]) {
    for (auto& x : arr) std::cout << x << " ";
    std::cout << "\n";
}

// Swap elements
template <typename T>
void swap(T& a, T& b) {
    T a_orig = std::move(a);
    a = std::move(b);
    b = std::move(a_orig);
}

// Reverse an array
template <typename T, std::size_t size>
void reverse(T (&arr)[size]) {
    if (size > 1) {
        for(std::size_t left = 0, right = size - 1; left < right; left++, right--) {
            swap(arr[left], arr[right]);
        } 
    }
}

int main() {
    int arr[] = { 1, 2, 3 };
    print(arr);
    reverse(arr);
    print(arr);
}

相关问题