Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 反向/中途交换_C++_Algorithm_Vector_Reverse_Swap - Fatal编程技术网

C++ 反向/中途交换

C++ 反向/中途交换,c++,algorithm,vector,reverse,swap,C++,Algorithm,Vector,Reverse,Swap,要反转整个向量,存在std::reverse。但是我想把一个向量“分”为两部分(正好在中间),然后把两部分都倒过来,把它们放在一起,再把整个向量倒过来。例如,我们有: 0 1 2 3 4 5 6 7 然后将其分为两部分,并将其反转: 01123->32110和4567->7654,将颠倒的部分放在一起3210654然后再次颠倒:4567013 我尝试了reverse\u copy,但没有成功。以下是我的代码片段: std::vector<int>::iterator mid = n

要反转整个
向量
,存在
std::reverse
。但是我想把一个向量“分”为两部分(正好在中间),然后把两部分都倒过来,把它们放在一起,再把整个
向量倒过来。例如,我们有:

0 1 2 3 4 5 6 7
然后将其分为两部分,并将其反转:

01123
->
32110
4567
->
7654
,将颠倒的部分放在一起
3210654
然后再次颠倒:
4567013

我尝试了
reverse\u copy
,但没有成功。以下是我的代码片段:

std::vector<int>::iterator mid = nr.begin() + nr.size() / 2;
std::vector<int>::iterator midLast = nr.size() / 2 + nr.end();
vector<int> temp1, temp2;
std::reverse_copy(nr.begin(),mid, std::begin(temp1));
std::reverse_copy(midLast, nr.end(), std::begin(temp2));
std::reverse(temp1.begin(), temp2.end());
std::vector::iterator mid=nr.begin()+nr.size()/2;
std::vector::iterator midLast=nr.size()/2+nr.end();
向量temp1,temp2;
标准::反向拷贝(编号begin(),mid,标准::begin(temp1));
标准::反向拷贝(中间,编号end(),标准::开始(temp2));
std::reverse(temp1.begin(),temp2.end());
我如何实施我的方法?谢谢

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的输出

4 5 6 7 0 1 2 3

可以使用标准算法
std::swap\u 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;
}
#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;
}
否则,您可以只使用
std::reverse
而不是算法
std::reverse\u copy

比如说

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

此版本将处理奇数个元素(中间一个不动)


正如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;
}
#包括
#包括
#包括
void printVector(const std::vector和aVector)
{
用于(自动和val:aVector)
{

STD::如果有奇数个元素,你想要发生什么?有趣的是,这通常被认为是一个可能的“聪明”的实现,它实现了你想要的。@ ReScReCurtIn比中间元素应该一直保持在<代码>向量的中间。<代码> nr siz()/2 +nr端()
远远超出了
nr.end()
。我冒昧添加了丢失的最终反面。编辑:交叉编辑…我添加的内容被删除。@FilipKočica第一个
std::reverse
很好,但在第二个时,我突然只得到了第二个数字。这怎么可能?两个例子对我都有效,到底有什么问题?现在我的评论已经不存在了(对于像
0123854678
这样的奇数,输出是:
678012345
@FilipKočica谢谢!@Unnamed Lol iam dumb,我用
/
代替了
%
。现在它工作正常。当元素数为奇数时,std::rotate不工作。中间的元素不能移动。)。
 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);
#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;
}