Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.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++_Arrays_Sorting - Fatal编程技术网

C++ 根据其他数组对数组进行排序

C++ 根据其他数组对数组进行排序,c++,arrays,sorting,C++,Arrays,Sorting,我有一个包含两个元素的数组。现在我想对所有以零结尾的值(例如,arr[3][0],arr[1][0])进行排序,从低到高排序 然后,我希望将以1结尾的值(例如,arr[2][1],arr[1][1])也进行排序,但不是按照其自身的顺序,而是按照与第一个数组相同的顺序进行排序 以下是我尝试过的: int compareInts(const void* a, const void* b) { return ( *(int*) a[0] - *(int*) b[0] ); } int arr

我有一个包含两个元素的数组。现在我想对所有以零结尾的值(例如,
arr[3][0]
arr[1][0]
)进行排序,从低到高排序

然后,我希望将以1结尾的值(例如,
arr[2][1]
arr[1][1]
)也进行排序,但不是按照其自身的顺序,而是按照与第一个数组相同的顺序进行排序

以下是我尝试过的:

int compareInts(const void* a, const void* b)
{
    return ( *(int*) a[0] - *(int*) b[0] );
}

int arr[4][2];

arr[0][0] = 50;
arr[0][1] = 0;

arr[1][0] = 40;
arr[1][1] = 1;

arr[2][0] = 50;
arr[2][1] = 2;

arr[3][0] = 85;
arr[3][1] = 3;

qsort( arr, 4, sizeof(int), compareInts );

我希望得到以下结果:

arr[0][0] = 40;
arr[0][1] = 1;

arr[1][0] = 50;
arr[1][1] = 0;

arr[2][0] = 50;
arr[2][1] = 2;

arr[3][0] = 85;
arr[3][1] = 3;

只需实现您自己的搜索算法(使用气泡排序或任何您认为最有效的方法),并执行类似于以下伪代码的比较/交换:

if(a[i][0] > a[j][0])
{
    t[0] = a[i][0];
    t[1] = a[i][1];
    a[i][0] = a[j][0];
    a[i][1] = a[j][1];
    a[j][0] = t[0];
    a[j][1] = t[1];
}
如果您想基于多个collumn进行排序,您只需重复此操作,比较其他子数组元素并首先对最不重要的列进行排序

编辑: 我认为使用qsort()也可以做到这一点。您只需相应地设置元素大小(在您的示例中应为
2*sizeof(int)
)。保持代码的其余部分不变(尽管我不确定这一点,现在无法测试运行它)。

一种方法:

using namespace std;
struct Compare
{
    bool operator()(const pair<int,int>& p1,
                    const pair<int,int>& p2)
    {
        return p1.first < p2.first;
    }
};

int main()
{
    int arr[4][2];

    arr[0][0] = 50;
    arr[0][1] = 0;

    arr[1][0] = 40;
    arr[1][1] = 1;

    arr[2][0] = 50;
    arr[2][1] = 2;

    arr[3][0] = 85;
    arr[3][1] = 3;

    //Create a vector of pairs
    vector<pair<int,int> > pairs;
    for(int  i = 0; i < 4; ++i)
    {
        pairs.push_back(make_pair(arr[i][0], arr[i][1]));
    }

    //Sort the vector on the first element using the functor
    stable_sort(pairs.begin(), pairs.end(), Compare());

    //Copy the result back
    for(size_t idx = 0; idx < pairs.size(); ++idx)
    {
        arr[idx][0] = pairs[idx].first;
        arr[idx][1] = pairs[idx].second;
    }
    return 0;
}
使用名称空间std;
结构比较
{
布尔运算符()(常量对和p1,
常量对(p2)
{
返回p1.first
是否必须具有类型为
int[][]的数组
?如果没有,你可以做如下的事情(或多或少像Asha回答的那样,当他的答案出现时我已经在打字了)

#包括
#包括
结构cmpTwoIntsPair
{
布尔运算符()
{
返回lhs.first
谢谢!!我只需将此项更改:
sizeof(int)
2*sizeof(int)
#include <algorithm>
#include <utility>

struct cmpTwoIntsPair
{
  bool operator() (pair<int, int> const & lhs, pair<int, int> const & rhs)
  {
    return lhs.first < rhs.first;
  }
}

typedef std::pair<int, int> twoInts;

unsigned int arrSize = 5;
twoInts arr[arrSize];

... Insert values here ...

std::sort(arr, arr + arrSize, cmpTwoIntsPair);