[英]Reversing an array (vector) using reverse_iterator
我正在尝试使用Edabit挑战并测试“新”功能来提高我的c ++知识。 当前的挑战是希望我们编写一个函数来反转数组。 例子:
reverse([1, 2, 3, 4]) ➞ [4, 3, 2, 1]
reverse([9, 9, 2, 3, 4]) ➞ [4, 3, 2, 9, 9]
reverse([]) ➞ []
我尝试使用reverse_iterator进行此操作,但结果有些奇怪。
std::vector<int> reverse(std::vector<int> arr) {
std::vector<int> out;
for(std::vector<int>::reverse_iterator i = arr.rbegin(); i != arr.rend(); ++i)
{
out.push_back(arr[*i]);
}
return out;
}
我得到的结果如下:
FAILED: Expected: equal to [ 4, 3, 2, 1 ]
Actual: [ 0, 4, 3, 2 ]
首先,看起来好像只有一次,o我在rbegin()中加了1并撕成如下:
for(std::vector<int>::reverse_iterator i = arr.rbegin() + 1; i != arr.rend() + 1; ++i)
似乎第一个测试通过了,但是随后的测试似乎还很遥远:
FAILED: Expected: equal to [ 7, 6, 5 ]
Actual: [ 33, 0, 5 ]
我正在尝试了解此反向迭代器的工作方式,因此请提供解决方案,并提供一些清晰的解释,说明为什么第一个测试加上1才通过,第二个为什么没有通过。
尝试:
for(std::vector<int>::reverse_iterator i = arr.rbegin(); i != arr.rend(); ++i)
{
out.push_back(*i);
}
迭代器已经为您提供了一个值,而不是向量的索引。
下标运算符中的表达式
out.push_back(arr[*i]);
^^^^^^^
没有道理。
你的意思是
out.push_back( *i );
但是无论如何,函数可以这样更好地编写,以创建新的反向矢量
#include <iostream>
#include <vector>
#include <iterator>
std::vector<int> reverse( const std::vector<int> &v )
{
std::vector<int> out;
out.reserve( v.size() );
for ( auto first = std::rbegin( v ), last = std::rend( v ); first != last; ++first )
{
out.push_back( *first );
}
return out;
}
int main()
{
std::vector<int> v = { 4, 3, 2, 1 };
for ( const auto &item : v ) std::cout << item << ' ';
std::cout << '\n';
auto reversed_v = reverse( v );
for ( const auto &item : reversed_v ) std::cout << item << ' ';
std::cout << '\n';
return 0;
}
程序输出为
4 3 2 1
1 2 3 4
或像这样将向量反向
#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
void reverse( std::vector<int> &v )
{
if ( not v.empty() )
{
for ( auto first = std::rbegin( v ), last = std::rend( v ); first < --last; ++first )
{
std::iter_swap( first, last );
}
}
}
int main()
{
std::vector<int> v = { 4, 3, 2, 1 };
for ( const auto &item : v ) std::cout << item << ' ';
std::cout << '\n';
reverse( v );
for ( const auto &item : v ) std::cout << item << ' ';
std::cout << '\n';
return 0;
}
程序输出与上图相同
4 3 2 1
1 2 3 4
另外,也可以使用相应的标准算法std::reverse_copy
和std::reverse
。
尽可能在标准库中优先使用算法,而不是手工制作的循环,因为:
1)它们更具表现力;
2)他们可能会更有效率。
std::reverse(std::begin(arr), std::end(arr));
只需包含“ algorithm”标头即可使用std :: reverse。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.