提问人:Xiaotian Hong 提问时间:7/8/2022 最后编辑:JeJoXiaotian Hong 更新时间:7/8/2022 访问量:105
如何使用 std::sort 对静态初始化的二维数组进行排序?
How to sort a statically initiallized 2-D array with std::sort?
问:
我初始化了一个二维数组 (),我想按如下方式对其进行排序:n rows * 2 cols
std::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.
答:
2赞
JeJo
7/8/2022
#1
我初始化了一个二维数组 (),我想按 [...]
n rows * 2 cols
std::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
评论
int