使用反向迭代器反转数组(向量) 我试图用EdabIT挑战改进我的C++知识,并测试出“新”函数。当前的挑战要求我们编写一个函数来反转数组。 示例: reverse([1, 2, 3, 4]) ➞ [4, 3, 2, 1] reverse([9, 9, 2, 3, 4]) ➞ [4, 3, 2, 9, 9] reverse([]) ➞ []
我尝试使用反向迭代器来实现这一点,但我得到了一些奇怪的结果 std::vector reversestd::vector arr{ std::向量输出; forstd::vector::reverse_迭代器i=arr.rbegin;i!=arr.rend;++i { 向外推,向后推; } 返回; } 我得到的结果如下:使用反向迭代器反转数组(向量) 我试图用EdabIT挑战改进我的C++知识,并测试出“新”函数。当前的挑战要求我们编写一个函数来反转数组。 示例: reverse([1, 2, 3, 4]) ➞ [4, 3, 2, 1] reverse([9, 9, 2, 3, 4]) ➞ [4, 3, 2, 9, 9] reverse([]) ➞ [],c++,vector,iterator,c++17,C++,Vector,Iterator,C++17,我尝试使用反向迭代器来实现这一点,但我得到了一些奇怪的结果 std::vector reversestd::vector arr{ std::向量输出; forstd::vector::reverse_迭代器i=arr.rbegin;i!=arr.rend;++i { 向外推,向后推; } 返回; } 我得到的结果如下: FAILED: Expected: equal to [ 4, 3, 2, 1 ] Actual: [ 0, 4, 3, 2 ] 首先,它似乎只是一个关闭,我添加了1与rbe
FAILED: Expected: equal to [ 4, 3, 2, 1 ]
Actual: [ 0, 4, 3, 2 ]
首先,它似乎只是一个关闭,我添加了1与rbegin和rend如下:
for(std::vector<int>::reverse_iterator i = arr.rbegin() + 1; i != arr.rend() + 1; ++i)
我试图了解这个反向迭代器是如何工作的,因此请提供一个解决方案和一些清晰的解释,说明为什么第一个测试通过了1的加法,为什么第二个测试没有通过。尝试:
for(std::vector<int>::reverse_iterator i = arr.rbegin(); i != arr.rend(); ++i)
{
out.push_back(*i);
}
迭代器已经为您提供了一个值,而不是向量的索引。请尝试:
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;
}
或者像这样反转一个向量
#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;
}
或者,您可以使用相应的标准算法std::reverse\u copy和std::reverse。下标运算符中的表达式
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;
}
或者像这样反转一个向量
#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;
}
或者,您可以使用相应的标准算法std::reverse\u copy和std::reverse。尽可能选择标准库中的算法而不是手工制作的循环,因为: 1他们更有表现力; 2他们可能会更有效率
只需包含'algorithm'标题即可使用std::reverse。尽可能选择标准库中的算法而不是手工制作的循环,因为: 1他们更有表现力; 2他们可能会更有效率
只需包含“算法”标题即可使用std::reverse。谢谢,它成功了!所以第一次通过加1的测试只是巧合?是的,就是这样。谢谢,它成功了!所以第一个通过添加1的测试只是巧合?是的,确实如此。@Aconcagua它是运算符的保留替代表示形式!。我知道。。。就像或可以用来代替| |或bitand代替&。这是非常罕见的——事实上,以前从未见过它们被真正使用过——不要把它当作批评:。@Aconcagua它是运营商的保留替代代表!。我知道。。。就像或可以用来代替| |或bitand代替&。看到–实际上以前从未见过它们真正被使用–这是很不寻常的,不要把它当作批评:。您可以简单地使用return std::vectorarr.rbegin,arr.rend的1行解决方案;您可以简单地使用return std::vectorarr.rbegin、arr.rend的1行解决方案;