我一直在尝试做一些简单的事情,比如使用 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;
}
请帮忙
如目前所写,您的“反向”算法试图通过与相邻元素交换来使元素在数组中冒泡。这不仅效率很低,而且根本行不通。
您 可以 使用交换来反转数组,但您应该从数组的每一端执行此操作。例如,交换第一个和最后一个元素,然后交换第二个和倒数第二个元素,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);
}