C++ 是否可以仅使用std::sort()将零移动到数组的末尾?

C++ 是否可以仅使用std::sort()将零移动到数组的末尾?,c++,sorting,stl,C++,Sorting,Stl,我正在研究这个问题: 给定一个数组nums,编写一个函数将所有0移到它的末尾,同时保持非零元素的相对顺序 我知道如何通过就地交换来回答这个问题,但我也想看看是否可以用std::sort来解决这个问题 根据cplusplus.com: sort函数的comparator函数是一个二进制函数,它接受范围内的两个元素作为参数,并返回一个可转换为bool的值。返回的值指示作为第一个参数传递的元素在其定义的特定严格弱顺序中是否被视为在第二个参数之前 函数不得修改其任何参数 这可以是函数指针或函数对象 //

我正在研究这个问题:

给定一个数组nums,编写一个函数将所有0移到它的末尾,同时保持非零元素的相对顺序

我知道如何通过就地交换来回答这个问题,但我也想看看是否可以用
std::sort
来解决这个问题

根据cplusplus.com:

sort函数的comparator函数是一个二进制函数,它接受范围内的两个元素作为参数,并返回一个可转换为bool的值。返回的值指示作为第一个参数传递的元素在其定义的特定严格弱顺序中是否被视为在第二个参数之前

函数不得修改其任何参数

这可以是函数指针或函数对象

//以下评论基于我的理解
静态bool comp(内部a、内部b){
//lambda函数的计算结果为true-无交换,
//计算为假交换
如果(a==0)返回false;
如果(b==0),则返回true;
//如果a和b都不为0,则不交换
返回true;
}
无效移动零(向量和nums){
排序(nums.begin(),nums.end(),comp);
}
给定的测试用例是
[0,1,0,3,12]


我的输出是
[12,3,1,0,0]

您想要使用的排序顺序就是零比所有非零值“大”,并且等于其他零。所有其他非零值“小于”零,并与任何其他非零值相等


正确构造比较函数,然后您可以在调用std::stable\u sort时使用它来实现您想要做的事情。

您几乎做到了。在比较器函数中,必须返回
false
才能不交换它们。另外,更改
std::sort
以保持值的原始顺序

static bool comp(int a, int b)
{
    //lambda function evaluates to true - no swap, 
    //evaluates to false -swap
    if(a==0) return false;
    if(b==0) return true;
    //if neither a nor b is 0 them do not swap
    return false;
}

void moveZeros(std::vector<int>& nums)
{
    std::stable_sort(nums.begin(),nums.end(),comp);
}
static bool comp(内部a、内部b)
{
//lambda函数的计算结果为true-无交换,
//计算为假交换
如果(a==0)返回false;
如果(b==0),则返回true;
//如果a和b都不为0,则不交换
返回false;
}
无效移动零(标准::向量和nums)
{
std::stable_sort(nums.begin(),nums.end(),comp);
}

正如Drew Dorman所指出的,稳定划分是正确的算法。代码如下:

#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> data { 0, 1, 0, 3, 12 };

    std::stable_partition(
        data.begin(), data.end(), [](int n) { return n != 0; });

    for (auto i : data)
        cout << i << ' ';

    cout << endl;
}
#包括
#包括
#包括
使用名称空间std;
int main()
{
向量数据{0,1,0,3,12};
std::稳定分区(
data.begin(),data.end(),[](int n){return n!=0;});
用于(自动i:数据)

这可以归结为对标准的解释。
comp
函数声明需要强制执行严格的弱排序。
comp(4,5)
显然是
true
,但是
comp(5,4)
也将是正确的。从技术上讲,这打破了严格的弱顺序,但是考虑到这个用例,我不认为行为是完全未定义的。@Chad这是一个严格的弱顺序。
4
5
的值对于所需的排序是等效的,因此在任何一个顺序进行比较时都应该返回false。虽然不可怕在这个问题中,像这样的任务的预期算法应该是或。或者更简洁地说,就是
return(a!=0)&&(b==0);
或者就是
return b==0;
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> data { 0, 1, 0, 3, 12 };

    std::stable_partition(
        data.begin(), data.end(), [](int n) { return n != 0; });

    for (auto i : data)
        cout << i << ' ';

    cout << endl;
}