如何使用 std::sort 对静态初始化的二维数组进行排序?

How to sort a statically initiallized 2-D array with std::sort?

提问人:Xiaotian Hong 提问时间:7/8/2022 最后编辑:JeJoXiaotian Hong 更新时间:7/8/2022 访问量:105

问:

我初始化了一个二维数组 (),我想按如下方式对其进行排序:n rows * 2 colsstd::sort

// before std::sort
4 6
3 3
2 3

// after std::sort
2 3
3 3
4 6

功能如下:cmp

static bool cmp(int m1[2], int m2[2]) 
{
    if (m1[1] != m2[1])
        return m1[1] < m2[1];
    return m1[0] < m2[0];
}

所有代码都在这里:

#include <cstdio>
#include <algorithm>

using namespace std;

int ministers[1010][2];
int n, a, b;

static bool cmp(int m1[2], int m2[2]) 
{
    if (m1[1] != m2[1])
        return m1[1] < m2[1];
    return m1[0] < m2[0];
}

int main()
{
    scanf("%d%d%d", &n, &a, &b);
    for (int i = 0; i < n; i++)
        scanf("%d %d", &ministers[i][0], &ministers[i][1]);
    std::sort(ministers, ministers+n, cmp);
    return 0;
}

但是CLione编辑器给了我一个静态错误:静态错误

当我尝试编译此代码时,发生了编译错误:

====================[ Build | Vijos | Debug ]===================================
"F:\Program Files\JetBrains\CLion 2021.2.3\bin\cmake\win\bin\cmake.exe" --build E:\MyFilesCosec\CLionProjects\Vijos\cmake-build-debug --target Vijos -j 16
[1/2] Building CXX object CMakeFiles/Vijos.dir/main.cpp.obj
FAILED: CMakeFiles/Vijos.dir/main.cpp.obj 
"F:\Program Files\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\bin\c++.exe"   -g -MD -MT CMakeFiles/Vijos.dir/main.cpp.obj -MF CMakeFiles\Vijos.dir\main.cpp.obj.d -o CMakeFiles/Vijos.dir/main.cpp.obj -c E:/MyFilesCosec/CLionProjects/Vijos/main.cpp
In file included from F:/Program Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/algorithm:62,
                 from E:/MyFilesCosec/CLionProjects/Vijos/main.cpp:2:
F:/Program Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/bits/stl_algo.h: In instantiation of 'void std::__insertion_sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = int (*)[2]; _Compare = __gnu_cxx::__ops::_Iter_comp_iter<bool (*)(const int*, const int*)>]':
F:/Program Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/bits/stl_algo.h:1885:25:   required from 'void std::__final_insertion_sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = int (*)[2]; _Compare = __gnu_cxx::__ops::_Iter_comp_iter<bool (*)(const int*, const int*)>]'
F:/Program Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/bits/stl_algo.h:1971:31:   required from 'void std::__sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = int (*)[2]; _Compare = __gnu_cxx::__ops::_Iter_comp_iter<bool (*)(const int*, const int*)>]'
F:/Program Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/bits/stl_algo.h:4866:18:   required from 'void std::sort(_RAIter, _RAIter, _Compare) [with _RAIter = int (*)[2]; _Compare = bool (*)(const int*, const int*)]'
E:/MyFilesCosec/CLionProjects/Vijos/main.cpp:19:42:   required from here
F:/Program Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/bits/stl_algo.h:1850:3: error: array must be initialized with a brace-enclosed initializer
   __val = _GLIBCXX_MOVE(*__i);
   ^~~~~
F:/Program Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/bits/stl_algo.h:1852:17: error: invalid array assignment
        *__first = _GLIBCXX_MOVE(__val);
                 ^
In file included from F:/Program Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/bits/stl_algo.h:61,
                 from F:/Program Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/algorithm:62,
                 from E:/MyFilesCosec/CLionProjects/Vijos/main.cpp:2:
F:/Program Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/bits/stl_heap.h: In instantiation of 'void std::__make_heap(_RandomAccessIterator, _RandomAccessIterator, _Compare&) [with _RandomAccessIterator = int (*)[2]; _Compare = __gnu_cxx::__ops::_Iter_comp_iter<bool (*)(const int*, const int*)>]':
F:/Program Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/bits/stl_algo.h:1672:23:   required from 'void std::__heap_select(_RandomAccessIterator, _RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = int (*)[2]; _Compare = __gnu_cxx::__ops::_Iter_comp_iter<bool (*)(const int*, const int*)>]'
F:/Program Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/bits/stl_algo.h:1933:25:   required from 'void std::__partial_sort(_RandomAccessIterator, _RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = int (*)[2]; _Compare = __gnu_cxx::__ops::_Iter_comp_iter<bool (*)(const int*, const int*)>]'
F:/Program Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/bits/stl_algo.h:1948:27:   required from 'void std::__introsort_loop(_RandomAccessIterator, _RandomAccessIterator, _Size, _Compare) [with _RandomAccessIterator = int (*)[2]; _Size = long long int; _Compare = __gnu_cxx::__ops::_Iter_comp_iter<bool (*)(const int*, const int*)>]'
F:/Program Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/bits/stl_algo.h:1968:25:   required from 'void std::__sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = int (*)[2]; _Compare = __gnu_cxx::__ops::_Iter_comp_iter<bool (*)(const int*, const int*)>]'
F:/Program Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/bits/stl_algo.h:4866:18:   required from 'void std::sort(_RAIter, _RAIter, _Compare) [with _RAIter = int (*)[2]; _Compare = bool (*)(const int*, const int*)]'
E:/MyFilesCosec/CLionProjects/Vijos/main.cpp:19:42:   required from here
F:/Program Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/bits/stl_heap.h:341:15: error: array must be initialized with a brace-enclosed initializer
    _ValueType __value = _GLIBCXX_MOVE(*(__first + __parent));
               ^~~~~~~
F:/Program Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/bits/stl_heap.h: In instantiation of 'void std::__pop_heap(_RandomAccessIterator, _RandomAccessIterator, _RandomAccessIterator, _Compare&) [with _RandomAccessIterator = int (*)[2]; _Compare = __gnu_cxx::__ops::_Iter_comp_iter<bool (*)(const int*, const int*)>]':
F:/Program Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/bits/stl_algo.h:1675:19:   required from 'void std::__heap_select(_RandomAccessIterator, _RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = int (*)[2]; _Compare = __gnu_cxx::__ops::_Iter_comp_iter<bool (*)(const int*, const int*)>]'
F:/Program Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/bits/stl_algo.h:1933:25:   required from 'void std::__partial_sort(_RandomAccessIterator, _RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = int (*)[2]; _Compare = __gnu_cxx::__ops::_Iter_comp_iter<bool (*)(const int*, const int*)>]'
F:/Program Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/bits/stl_algo.h:1948:27:   required from 'void std::__introsort_loop(_RandomAccessIterator, _RandomAccessIterator, _Size, _Compare) [with _RandomAccessIterator = int (*)[2]; _Size = long long int; _Compare = __gnu_cxx::__ops::_Iter_comp_iter<bool (*)(const int*, const int*)>]'
F:/Program Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/bits/stl_algo.h:1968:25:   required from 'void std::__sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = int (*)[2]; _Compare = __gnu_cxx::__ops::_Iter_comp_iter<bool (*)(const int*, const int*)>]'
F:/Program Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/bits/stl_algo.h:4866:18:   required from 'void std::sort(_RAIter, _RAIter, _Compare) [with _RAIter = int (*)[2]; _Compare = bool (*)(const int*, const int*)]'
E:/MyFilesCosec/CLionProjects/Vijos/main.cpp:19:42:   required from here
F:/Program Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/bits/stl_heap.h:251:18: error: array must be initialized with a brace-enclosed initializer
       _ValueType __value = _GLIBCXX_MOVE(*__result);
                  ^~~~~~~
F:/Program Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/bits/stl_heap.h:252:17: error: invalid array assignment
       *__result = _GLIBCXX_MOVE(*__first);
                 ^
ninja: build stopped: subcommand failed.

C++ 数组 算法 排序 C++-标准库

评论

0赞 Ted Lyngmo 7/8/2022
您正在越界地窥视数组。
0赞 WhozCraig 7/8/2022
仅供参考,qsort 更适合这一点(这种情况很少见),如果您坚持使用 .int

答:

2赞 JeJo 7/8/2022 #1

我初始化了一个二维数组 (),我想按 [...]n rows * 2 colsstd::sort

如果 col 计数始终为 2,则应使用

作为此处合适的数据结构。 这将有助于通过简单的 std::p air 比较运算符来比较元素。

使用您可能执行的数组的示例std::pair<int, int>

std::pair<int, int> ministers[1010]; // array of  pair of ints
int n;  std::cin >> n;

for (int i = 0; i < n; i++)
    std::cin >> ministers[i].first >> ministers[i].second;
// compare function is a lambda
std::sort(ministers, ministers + n
       , [](const auto& m1, const auto& m2) { return m1 < m2; });
   // use of std::pair<int, int>::operator<  --> ^^^^^^^^^^^^^^^

现场演示

评论

0赞 Xiaotian Hong 7/8/2022
谢谢你的回答。但是我想知道为什么我的代码不能通过编译,以及如果部长的类型必须像 int[][],如何使用 std::sort 对其进行排序?
3赞 WhozCraig 7/8/2022
@XiaotianHong本机数组是不可分配的。例如,在C++(或C)中是不合法的。此类操作是必需的。查看每个实际错误;它们都是对任务的尝试。int a[2], b[2] = {0}; a = b;std::sort