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

问题描述 投票:0回答:1

我一直在尝试做一些简单的事情,比如使用 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;
        } 

请帮忙

c++ arrays reverse
1个回答
0
投票

如目前所写,您的“反向”算法试图通过与相邻元素交换来使元素在数组中冒泡。这不仅效率很低,而且根本行不通。

可以 使用交换来反转数组,但您应该从数组的每一端执行此操作。例如,交换第一个和最后一个元素,然后交换第二个和倒数第二个元素,etc直到到达数组的中间。

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);
}

否则,实现你自己的

swap
reverse

#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);
}
© www.soinside.com 2019 - 2024. All rights reserved.