反向矢量,并构建另一个矢量

时间:2014-04-16 09:49:20

标签: c++ vector reverse

我想知道是否有办法扭转一个向量并将其构建到另一个向量中?

#include "std_lib_facilities.h"

int main()
{
    vector<int> oldvector;
    oldvector[1];
    oldvector[3];
    oldvector[5];
    oldvector[7];
    oldvector[9];
}

这是我到目前为止,任何帮助都会很棒。

4 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

要反转矢量,您只需使用

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

然后将其用作新的载体。

答案 2 :(得分:2)

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

考虑以下可编译的示例代码(live here on Ideone.com):

rend()

输出:

#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);
}

答案 3 :(得分:2)

有几种方法可以完成这项任务。最简单的方法是使用带有参数的构造函数或成员函数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;
}

另一种方法是使用标准算法std::reverse_copy。例如

#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;
}