反转矢量,然后构建另一个矢量

Reverse vector, and build another vector

本文关键字:构建 另一个 然后      更新时间:2023-10-16

我想知道是否有一种方法可以反转一个向量并将其构建到另一个向量中?

#include "std_lib_facilities.h"
int main()
{
    vector<int> oldvector;
    oldvector[1];
    oldvector[3];
    oldvector[5];
    oldvector[7];
    oldvector[9];
}

这就是我目前所拥有的,任何帮助都将是伟大的。

如果你想创建一个新的矢量,那么你可以这样做:

std::vector<int> oldvector = {1,2,3,4,5};
std::vector<int> newvector(oldvector.rbegin(), oldvector.rend());

对于矢量的反演,您可以简单地使用

std::reverse(a.begin(), a.end());

然后将其用作新的矢量。

有几种方法可以完成这项任务。最简单的方法是使用带有参数的构造函数或成员函数assign作为迭代器

例如

#include <vector>
#include <iostream>
int main()
{
    std::vector<int> v1 = { 1, 3, 5, 7, 9 };
    std::vector<int> v2( v1.rbegin(), v1.rend() );
    for ( int x : v1 ) std::cout << x << ' ';
    std::cout << std::endl;
    for ( int x : v2 ) std::cout << x << ' ';
    std::cout << std::endl;
}

#include <vector>
#include <iostream>
int main()
{
    std::vector<int> v1 = { 1, 3, 5, 7, 9 };
    std::vector<int> v2;
    v2.assign( v1.rbegin(), v1.rend() );
    for ( int x : v1 ) std::cout << x << ' ';
    std::cout << std::endl;
    for ( int x : v2 ) std::cout << x << ' ';
    std::cout << std::endl;
}

另一种方法是使用标准算法CCD_ 2。例如

#include <vector>
#include <iostream>
#include <algorithm>
#include <iterator>
int main()
{
    std::vector<int> v1 = { 1, 3, 5, 7, 9 };
    std::vector<int> v2;
    v2.reserve( v1.size() ); 
    std::reverse_copy( v1.begin(), v1.end(), std::back_inserter( v2 ) );
    for ( int x : v1 ) std::cout << x << ' ';
    std::cout << std::endl;
    for ( int x : v2 ) std::cout << x << ' ';
    std::cout << std::endl;
}

或者你可以用普通的循环写同样的东西

#include <vector>
#include <iostream>
int main()
{
    std::vector<int> v1 = { 1, 3, 5, 7, 9 };
    std::vector<int> v2;
    v2.reserve( v1.size() ); 
    for ( std::vector<int>::size_type i = v1.size(); i != 0; )
    {
        --i;
        v2.push_back( v1[i] );
    }
    for ( int x : v1 ) std::cout << x << ' ';
    std::cout << std::endl;
    for ( int x : v2 ) std::cout << x << ' ';
    std::cout << std::endl;
}

或者甚至可以使用堆栈作为中间容器!:)

#include <iostream>
#include <vector>
#include <stack>
int main() 
{
    std::vector<int> v1 = { 1, 3, 5, 7, 9 };
    std::stack<int> s;
    for ( int x : v1 ) s.push( x );
    std::vector<int> v2;
    v2.reserve( v1.size() );
    while ( !s.empty() ) 
    {
        v2.push_back( s.top() );
        s.pop();
    }
    for ( int x : v1 ) std::cout << x << ' ';
    std::cout << std::endl;
    for ( int x : v2 ) std::cout << x << ' ';
    std::cout << std::endl;

    return 0;
}

那么递归函数呢?例如,它可以看起来像

#include <iostream>
#include <vector>
std::vector<int>::iterator reverse( std::vector<int>::const_iterator first,
                                    std::vector<int>::const_iterator last,
                                    std::vector<int>::iterator out  )
{
    if ( first != last )
    {
        int x = *first++;
        out = ::reverse( first, last, out );
        *out++ = x;
    }
    return out;
}
int main() 
{
    std::vector<int> v1 = { 1, 3, 5, 7, 9 };
    std::vector<int> v2( v1.size() );
    ::reverse( v1.cbegin(), v1.cend(), v2.begin() );
    for ( int x : v1 ) std::cout << x << ' ';
    std::cout << std::endl;
    for ( int x : v2 ) std::cout << x << ' ';
    std::cout << std::endl;

    return 0;
}

对不起!我忘了提到标准算法std::copy_backward。它也可以应用

#include <iostream>
#include <vector>
#include <algorithm>
int main() 
{
    std::vector<int> v1 = { 1, 3, 5, 7, 9 };
    std::vector<int> v2( v1.size() );
    std::copy_backward( v1.begin(), v1.end(), v2.rend() );
    for ( int x : v1 ) std::cout << x << ' ';
    std::cout << std::endl;
    for ( int x : v2 ) std::cout << x << ' ';
    std::cout << std::endl;

    return 0;
}

您可能希望使用std::reverse()在适当的位置反转向量,或者反转std::vector::rbegin()/rend()返回的迭代器来构建原始向量的反转副本

考虑以下可编译的示例代码(生活在Ideone.com上):

#include <algorithm>    // For std::reverse
#include <iostream>     // For console output
#include <vector>       // For std::vector
using namespace std;
// Used to print elements of a sequence (like vector).
template <typename Sequence>
void print(const Sequence& s) {
    cout << "[ ";
    for (const auto& x : s) {
        cout << x << ' ';
    }
    cout << "]" << endl;
}
int main() {
    cout << "Original vector:n";
    vector<int> v{10, 20, 30, 40, 50};
    print(v);
    vector<int> v2(v.rbegin(), v.rend());
    cout << "nReversed copy using reverse iterators:n";
    print(v2);
    reverse(v.begin(), v.end());    
    cout << "nReversed in-place using std::reverse():n";
    print(v);
}

输出:

Original vector:
[ 10 20 30 40 50 ]
Reversed copy using reverse iterators:
[ 50 40 30 20 10 ]
Reversed in-place using std::reverse():
[ 50 40 30 20 10 ]