在 C++ 中的反转数组
本文将讲解几种在 C++ 中如何反转数组的方法。
在 C++ 中使用基于 vector
范围的构造函数来反转数组
vector
容器支持构造函数,其范围由迭代器指定。因此,我们可以声明一个新的 vector
变量,并使用 rbegin
/rend
迭代器用第一个向量的反向值初始化它。
需要注意的是,我们还声明了一个函数 PrintVector
来保持克隆的整洁,并在单个函数调用中输出 vector
内容。这个方法的一个缺点是需要构造一个新的数组变量,这在某些场景下可能是不必要的开销。
#include <iostream>
#include <vector>
#include <iterator>
using std::cout; using std::endl;
using std::vector; using std::copy;
using std::ostream_iterator;
void PrintVector(vector<int> &arr)
{
copy(arr.begin(), arr.end(),
ostream_iterator<int>(cout,"; "));
cout << endl;
}
int main()
{
vector<int> arr1 = {1,2,3,4,5,6,7,8,9,10};
vector<int> arr1_reversed(arr1.rbegin(), arr1.rend());
PrintVector(arr1_reversed);
return EXIT_SUCCESS;
}
输出:
10; 9; 8; 7; 6; 5; 4; 3; 2; 1;
在 C++ 中使用 std::reverse
函数反转数组
另外,要想在不声明其他变量的情况下将数组元素原地反转,我们可以调用标准库中的 std::reverse
函数。std::reverse
是 <algorithm>
头文件的一部分,从 C++17 开始就成为标准库的一部分。该函数将范围内的 start/end
迭代器作为函数参数,并将元素就地交换。std::reverse
被调用的向量会被永久修改,随后对其元素的任何访问都会产生新的排序。
#include <iostream>
#include <vector>
#include <iterator>
using std::cout; using std::endl;
using std::vector; using std::copy;
using std::ostream_iterator;
using std::reverse;
void PrintVector(vector<int> &arr)
{
copy(arr.begin(), arr.end(),
ostream_iterator<int>(cout,"; "));
cout << endl;
}
int main()
{
vector<int> arr1 = {1,2,3,4,5,6,7,8,9,10};
reverse(arr1.begin(), arr1.end());
PrintVector(arr1);
return EXIT_SUCCESS;
}
输出:
10; 9; 8; 7; 6; 5; 4; 3; 2; 1;
在 C++ 中使用 rbegin
/rend
迭代器来反转数组
与本主题的第一个例子相反,在一些用例中,不需要将向的重新排序的内容存储在程序流中,而只是输出到控制台或显示。下面的例子演示了如何在不修改底层变量内容的情况下,将数组元素按相反顺序打印到控制台。
#include <iostream>
#include <vector>
#include <iterator>
using std::cout; using std::endl;
using std::vector; using std::copy;
using std::ostream_iterator;
void PrintVector(vector<int> &arr)
{
copy(arr.begin(), arr.end(),
ostream_iterator<int>(cout,"; "));
cout << endl;
}
int main()
{
vector<int> arr1 = {1,2,3,4,5,6,7,8,9,10};
copy(arr1.rbegin(), arr1.rend(),
ostream_iterator<int>(cout,"; "));
cout << endl;
return EXIT_SUCCESS;
}
输出:
10; 9; 8; 7; 6; 5; 4; 3; 2; 1;
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn