中途反向/交换

时间:2017-08-11 09:08:07

标签: c++ algorithm vector reverse swap

要反转整个fun fibonacci(): Sequence<Int> { // fibonacci terms // 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, ... return generateSequence(Pair(0, 1), { Pair(it.second, it.first + it.second) }).map { it.first } } println(fibonacci().take(10).toList()) // [0, 1, 1, 2, 3, 5, 8, 13, 21, 34] ,存在vector。但是我想将一个矢量分成两部分(恰好在中间)并反转两者,将它们重新组合在一起并再次反转整个std::reverse。例如,我们有:

vector

将两部分分开并反转两部分:

0 1 2 3 4 5 6 7 - &gt; 0 1 2 33 2 1 0 - &gt; 4 5 6 7,将反转的部分放在一起7 6 5 4然后再反转:3 2 1 0 7 6 5 4

我尝试使用4 5 6 7 0 1 2 3,但这没有成功。这是我的代码片段:

reverse_copy

我如何实施我的方法?谢谢!

4 个答案:

答案 0 :(得分:2)

std::reverse(nr.begin(), nr.begin() + nr.size() / 2 );
std::reverse(nr.begin() + nr.size() / 2 + ((nr.size() % 2) != 0 ? 1 : 0), nr.end());
std::reverse(nr.begin(), nr.end());

for (auto& it : nr)
{
    std::cout << it << " ";
}

0, 1, 2, 3, 4, 5, 6, 7, 8

的输出
5 6 7 8 4 0 1 2 3

0, 1, 2, 3, 4, 5, 6, 7

的输出
4 5 6 7 0 1 2 3

答案 1 :(得分:1)

可以使用标准算法std::swap_ranges完成任务。

例如

#include <iostream>
#include <iterator>
#include <algorithm>

int main()
{
    std::vector<int> v = { 0, 1, 2, 3, 4, 5, 6, 7 };

    std::swap_ranges(v.begin(), std::next(v.begin(), v.size() / 2),
        std::prev(v.end(), v.size() / 2));

    for (int x : v) std::cout << x << ' ';
    std::cout << std::endl;

    return 0;
}

程序输出

4 5 6 7 0 1 2 3

否则,您只能使用std::reverse代替算法std::reverse_copy

例如

#include <iostream>
#include <iterator>
#include <algorithm>

int main()
{
    std::vector<int> v = { 0, 1, 2, 3, 4, 5, 6, 7 };

    for (int x : v) std::cout << x << ' ';
    std::cout << std::endl;

    std::reverse(v.begin(), std::next(v.begin(), v.size() / 2));
    std::reverse(std::prev(v.end(), v.size() / 2), v.end());

    for (int x : v) std::cout << x << ' ';
    std::cout << std::endl;

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

    for (int x : v) std::cout << x << ' ';
    std::cout << std::endl;

    return 0;
}

程序输出

0 1 2 3 4 5 6 7
3 2 1 0 7 6 5 4
4 5 6 7 0 1 2 3

答案 2 :(得分:0)

此版本将处理奇数个元素(让中间元素无动于衷)

 auto size = nr.size();
 auto begin = nr.begin();
 auto end = nr.end();
 std::reverse(begin, begin + size/2);
 std::reverse(begin + size/2 + (size%2), end);
 std::reverse(begin, end);

答案 3 :(得分:0)

如BoBTFish所述,这就是std :: rotate的作用。

#include <vector>
#include <iostream>
#include <algorithm>

void printVector(const std::vector<int>& aVector)
{
    for (auto& val : aVector)
    {
        std::cout << val << " ";
    }

    std::cout << std::endl;
} 

int main()
{
    std::vector<int> intVect{0, 1,2,3,4,5,6,7};

    printVector(intVect);

    std::rotate(intVect.begin(), intVect.begin() + intVect.size() / 2, intVect.end());

    printVector(intVect);

    return 0;
}

这将输出所需的结果:

0 1 2 3 4 5 6 7

4 5 6 7 0 1 2 3