使用反向迭代器反转数组(向量) 我试图用EdabIT挑战改进我的C++知识,并测试出“新”函数。当前的挑战要求我们编写一个函数来反转数组。 示例: reverse([1, 2, 3, 4]) ➞ [4, 3, 2, 1] reverse([9, 9, 2, 3, 4]) ➞ [4, 3, 2, 9, 9] reverse([]) ➞ []

使用反向迭代器反转数组(向量) 我试图用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

我尝试使用反向迭代器来实现这一点,但我得到了一些奇怪的结果

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与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行解决方案;