std::ranges::is_heap

本文介绍了如何使用C++标准库中的`<algorithm>`实现堆排序,并展示了如何将排序后的向量转换为对应的二叉树结构。通过`std::ranges::is_heap`检查堆性质,然后使用递归函数`draw_heap`展示堆的可视化形式。

https://en.cppreference.com/w/cpp/algorithm/ranges/is_heap

#include <algorithm>
#include <bit>
#include <cmath>
#include <iostream>
#include <vector>
 
void out(const auto& what, int n = 1) { while (n-- > 0) std::cout << what; }
 
void draw_heap(auto const& v);
 
int main()
{
    std::vector<int> v { 3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8, 9, 7, 9, 3, 2, 3, 8 };
 
    out("initially, v:\n");
    for (auto i : v) std::cout << i << ' ';
    out('\n');
 
    if (!std::ranges::is_heap(v)) {
        out("making heap...\n");
        std::ranges::make_heap(v);
    }
 
    out("after make_heap, v:\n");
    for (auto t{1U}; auto i : v) {
        std::cout << i << (std::has_single_bit(++t) ? " │ " : " ");
    }
 
    out("\n" "corresponding binary tree is:\n");
    draw_heap(v);
}
 
void draw_heap(auto const& v)
{
    auto bails = [](int n, int w) {
        auto b = [](int w) { out("┌"), out("─", w), out("┴"), out("─", w), out("┐"); };
        n /= 2;
        if (!n) return;
        for (out(' ', w); n-- > 0; ) b(w), out(' ', w + w + 1);
        out('\n');
    };
    auto data = [](int n, int w, auto& first, auto last) {
        for(out(' ', w); n-- > 0 && first != last; ++first)
            out(*first), out(' ', w + w + 1);
        out('\n');
    };
    auto tier = [&](int t, int m, auto& first, auto last) {
        const int n {1 << t};
        const int w {(1 << (m - t - 1)) - 1};
        bails(n, w), data(n, w, first, last);
    };
    const int m {static_cast<int>(std::ceil(std::log2(1 + v.size())))};
    auto first {v.cbegin()};
    for (int i{}; i != m; ++i) { tier(i, m, first, v.cend()); }
}

g++.exe D:\clion\kexin\countMid\C++_multi_files_20251012165246089\main.cpp -o main In file included from D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/algorithm:61, from D:\clion\kexin\countMid\C++_multi_files_20251012165246089\solution.cpp:7, from D:\clion\kexin\countMid\C++_multi_files_20251012165246089\main.cpp:12: D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/stl_algo.h: In instantiation of 'void std::__insertion_sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<const int*, vector<int> >; _Compare = __gnu_cxx::__ops::_Iter_less_iter]': D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/stl_algo.h:1859:25: required from 'void std::__final_insertion_sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<const int*, vector<int> >; _Compare = __gnu_cxx::__ops::_Iter_less_iter]' D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/stl_algo.h:1950:31: required from 'void std::__sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<const int*, vector<int> >; _Compare = __gnu_cxx::__ops::_Iter_less_iter]' D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/stl_algo.h:4861:18: required from 'void std::sort(_RAIter, _RAIter) [with _RAIter = __gnu_cxx::__normal_iterator<const int*, vector<int> >]' D:\clion\kexin\countMid\C++_multi_files_20251012165246089\solution.cpp:18:13: required from here D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/stl_algo.h:1824:24: error: assignment of read-only location '__first.__gnu_cxx::__normal_iterator<const int*, std::vector<int> >::operator*()' 1824 | *__first = _GLIBCXX_MOVE(__val); | ^ In file included from D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/stl_algo.h:61: D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/stl_heap.h: In instantiation of 'void std::__pop_heap(_RandomAccessIterator, _RandomAccessIterator, _RandomAccessIterator, _Compare&) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<const int*, vector<int> >; _Compare = __gnu_cxx::__ops::_Iter_less_iter]': D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/stl_algo.h:1638:19: required from 'void std::__heap_select(_RandomAccessIterator, _RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<const int*, vector<int> >; _Compare = __gnu_cxx::__ops::_Iter_less_iter]' D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/stl_algo.h:1910:25: required from 'void std::__partial_sort(_RandomAccessIterator, _RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<const int*, vector<int> >; _Compare = __gnu_cxx::__ops::_Iter_less_iter]' D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/stl_algo.h:1926:27: required from 'void std::__introsort_loop(_RandomAccessIterator, _RandomAccessIterator, _Size, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<const int*, vector<int> >; _Size = long long int; _Compare = __gnu_cxx::__ops::_Iter_less_iter]' D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/stl_algo.h:1947:25: required from 'void std::__sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<const int*, vector<int> >; _Compare = __gnu_cxx::__ops::_Iter_less_iter]' D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/stl_algo.h:4861:18: required from 'void std::sort(_RAIter, _RAIter) [with _RAIter = __gnu_cxx::__normal_iterator<const int*, vector<int> >]' D:\clion\kexin\countMid\C++_multi_files_20251012165246089\solution.cpp:18:13: required from here D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/stl_heap.h:263:17: error: assignment of read-only location '__result.__gnu_cxx::__normal_iterator<const int*, std::vector<int> >::operator*()' 263 | *__result = _GLIBCXX_MOVE(*__first); | ^ In file included from D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/string:51, from D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/locale_classes.h:40, from D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/ios_base.h:41, from D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/ios:44, from D:\clion\kexin\countMid\C++_multi_files_20251012165246089\main.cpp:7: D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/stl_algobase.h: In instantiation of 'void std::iter_swap(_ForwardIterator1, _ForwardIterator2) [with _ForwardIterator1 = __gnu_cxx::__normal_iterator<const int*, vector<int> >; _ForwardIterator2 = __gnu_cxx::__normal_iterator<const int*, vector<int> >]': D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/stl_algo.h:91:20: required from 'void std::__move_median_to_first(_Iterator, _Iterator, _Iterator, _Iterator, _Compare) [with _Iterator = __gnu_cxx::__normal_iterator<const int*, vector<int> >; _Compare = __gnu_cxx::__ops::_Iter_less_iter]' D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/stl_algo.h:1897:34: required from '_RandomAccessIterator std::__unguarded_partition_pivot(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<const int*, vector<int> >; _Compare = __gnu_cxx::__ops::_Iter_less_iter]' D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/stl_algo.h:1931:38: required from 'void std::__introsort_loop(_RandomAccessIterator, _RandomAccessIterator, _Size, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<const int*, vector<int> >; _Size = long long int; _Compare = __gnu_cxx::__ops::_Iter_less_iter]' D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/stl_algo.h:1947:25: required from 'void std::__sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<const int*, vector<int> >; _Compare = __gnu_cxx::__ops::_Iter_less_iter]' D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/stl_algo.h:4861:18: required from 'void std::sort(_RAIter, _RAIter) [with _RAIter = __gnu_cxx::__normal_iterator<const int*, vector<int> >]' D:\clion\kexin\countMid\C++_multi_files_20251012165246089\solution.cpp:18:13: required from here D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/stl_algobase.h:185:11: error: no matching function for call to 'swap(const int&, const int&)' 185 | swap(*__a, *__b); | ~~~~^~~~~~~~~~~~ In file included from D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/exception:164, from D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/ios:41: D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/exception_ptr.h:230:5: note: candidate: 'void std::__exception_ptr::swap(exception_ptr&, exception_ptr&)' 230 | swap(exception_ptr& __lhs, exception_ptr& __rhs) | ^~~~ D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/exception_ptr.h:230:25: note: no known conversion for argument 1 from 'const int' to 'std::__exception_ptr::exception_ptr&' 230 | swap(exception_ptr& __lhs, exception_ptr& __rhs) | ~~~~~~~~~~~~~~~^~~~~ In file included from D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/exception_ptr.h:41: D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/move.h:196:5: note: candidate: 'template<class _Tp> std::_Require<std::__not_<std::__is_tuple_like<_Tp> >, std::is_move_constructible<_Tp>, std::is_move_assignable<_Tp> > std::swap(_Tp&, _Tp&)' 196 | swap(_Tp& __a, _Tp& __b) | ^~~~ D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/move.h:196:5: note: template argument deduction/substitution failed: In file included from D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/move.h:57: D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/type_traits: In substitution of 'template<bool _Cond, class _Tp> using std::__enable_if_t = typename std::enable_if::type [with bool _Cond = false; _Tp = void]': D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/type_traits:2224:11: required by substitution of 'template<class ... _Cond> using std::_Require = std::__enable_if_t<std::__and_<_Bn>::value> [with _Cond = {std::__not_<std::__is_tuple_like<const int> >, std::is_move_constructible<const int>, std::is_move_assignable<const int>}]' D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/move.h:196:5: required by substitution of 'template<class _Tp> std::_Require<std::__not_<std::__is_tuple_like<_Tp> >, std::is_move_constructible<_Tp>, std::is_move_assignable<_Tp> > std::swap(_Tp&, _Tp&) [with _Tp = const int]' D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/stl_algobase.h:185:11: required from 'void std::iter_swap(_ForwardIterator1, _ForwardIterator2) [with _ForwardIterator1 = __gnu_cxx::__normal_iterator<const int*, vector<int> >; _ForwardIterator2 = __gnu_cxx::__normal_iterator<const int*, vector<int> >]' D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/stl_algo.h:91:20: required from 'void std::__move_median_to_first(_Iterator, _Iterator, _Iterator, _Iterator, _Compare) [with _Iterator = __gnu_cxx::__normal_iterator<const int*, vector<int> >; _Compare = __gnu_cxx::__ops::_Iter_less_iter]' D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/stl_algo.h:1897:34: required from '_RandomAccessIterator std::__unguarded_partition_pivot(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<const int*, vector<int> >; _Compare = __gnu_cxx::__ops::_Iter_less_iter]' D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/stl_algo.h:1931:38: required from 'void std::__introsort_loop(_RandomAccessIterator, _RandomAccessIterator, _Size, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<const int*, vector<int> >; _Size = long long int; _Compare = __gnu_cxx::__ops::_Iter_less_iter]' D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/stl_algo.h:1947:25: required from 'void std::__sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<const int*, vector<int> >; _Compare = __gnu_cxx::__ops::_Iter_less_iter]' D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/stl_algo.h:4861:18: required from 'void std::sort(_RAIter, _RAIter) [with _RAIter = __gnu_cxx::__normal_iterator<const int*, vector<int> >]' D:\clion\kexin\countMid\C++_multi_files_20251012165246089\solution.cpp:18:13: required from here D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/type_traits:116:11: error: no type named 'type' in 'struct std::enable_if<false, void>' 116 | using __enable_if_t = typename enable_if<_Cond, _Tp>::type; | ^~~~~~~~~~~~~ D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/stl_algobase.h: In instantiation of 'void std::iter_swap(_ForwardIterator1, _ForwardIterator2) [with _ForwardIterator1 = __gnu_cxx::__normal_iterator<const int*, vector<int> >; _ForwardIterator2 = __gnu_cxx::__normal_iterator<const int*, vector<int> >]': D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/stl_algo.h:91:20: required from 'void std::__move_median_to_first(_Iterator, _Iterator, _Iterator, _Iterator, _Compare) [with _Iterator = __gnu_cxx::__normal_iterator<const int*, vector<int> >; _Compare = __gnu_cxx::__ops::_Iter_less_iter]' D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/stl_algo.h:1897:34: required from '_RandomAccessIterator std::__unguarded_partition_pivot(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<const int*, vector<int> >; _Compare = __gnu_cxx::__ops::_Iter_less_iter]' D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/stl_algo.h:1931:38: required from 'void std::__introsort_loop(_RandomAccessIterator, _RandomAccessIterator, _Size, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<const int*, vector<int> >; _Size = long long int; _Compare = __gnu_cxx::__ops::_Iter_less_iter]' D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/stl_algo.h:1947:25: required from 'void std::__sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<const int*, vector<int> >; _Compare = __gnu_cxx::__ops::_Iter_less_iter]' D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/stl_algo.h:4861:18: required from 'void std::sort(_RAIter, _RAIter) [with _RAIter = __gnu_cxx::__normal_iterator<const int*, vector<int> >]' D:\clion\kexin\countMid\C++_multi_files_20251012165246089\solution.cpp:18:13: required from here D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/move.h:220:5: note: candidate: 'template<class _Tp, long long unsigned int _Nm> std::__enable_if_t<std::__is_swappable<_Tp>::value> std::swap(_Tp (&)[_Nm], _Tp (&)[_Nm])' 220 | swap(_Tp (&__a)[_Nm], _Tp (&__b)[_Nm]) | ^~~~ D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/move.h:220:5: note: template argument deduction/substitution failed: D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/stl_algobase.h:185:11: note: mismatched types '_Tp [_Nm]' and 'const int' 185 | swap(*__a, *__b); | ~~~~^~~~~~~~~~~~ In file included from D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/stl_algobase.h:64: D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/stl_pair.h:879:5: note: candidate: 'template<class _T1, class _T2> typename std::enable_if<std::__and_<std::__is_swappable<_T1>, std::__is_swappable<_T2> >::value>::type std::swap(pair<_T1, _T2>&, pair<_T1, _T2>&)' 879 | swap(pair<_T1, _T2>& __x, pair<_T1, _T2>& __y) | ^~~~ D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/stl_pair.h:879:5: note: template argument deduction/substitution failed: D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/stl_algobase.h:185:11: note: mismatched types 'std::pair<_T1, _T2>' and 'const int' 185 | swap(*__a, *__b); | ~~~~^~~~~~~~~~~~ D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/stl_pair.h:896:5: note: candidate: 'template<class _T1, class _T2> typename std::enable_if<(! std::__and_<std::__is_swappable<_T1>, std::__is_swappable<_T2> >::value)>::type std::swap(pair<_T1, _T2>&, pair<_T1, _T2>&)' (deleted) 896 | swap(pair<_T1, _T2>&, pair<_T1, _T2>&) = delete; | ^~~~ D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/stl_pair.h:896:5: note: template argument deduction/substitution failed: D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/stl_algobase.h:185:11: note: mismatched types 'std::pair<_T1, _T2>' and 'const int' 185 | swap(*__a, *__b); | ~~~~^~~~~~~~~~~~ D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/stl_heap.h: In instantiation of 'void std::__adjust_heap(_RandomAccessIterator, _Distance, _Distance, _Tp, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<const int*, vector<int> >; _Distance = long long int; _Tp = int; _Compare = __gnu_cxx::__ops::_Iter_less_iter]': D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/stl_heap.h:356:22: required from 'void std::__make_heap(_RandomAccessIterator, _RandomAccessIterator, _Compare&) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<const int*, vector<int> >; _Compare = __gnu_cxx::__ops::_Iter_less_iter]' D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/stl_algo.h:1635:23: required from 'void std::__heap_select(_RandomAccessIterator, _RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<const int*, vector<int> >; _Compare = __gnu_cxx::__ops::_Iter_less_iter]' D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/stl_algo.h:1910:25: required from 'void std::__partial_sort(_RandomAccessIterator, _RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<const int*, vector<int> >; _Compare = __gnu_cxx::__ops::_Iter_less_iter]' D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/stl_algo.h:1926:27: required from 'void std::__introsort_loop(_RandomAccessIterator, _RandomAccessIterator, _Size, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<const int*, vector<int> >; _Size = long long int; _Compare = __gnu_cxx::__ops::_Iter_less_iter]' D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/stl_algo.h:1947:25: required from 'void std::__sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<const int*, vector<int> >; _Compare = __gnu_cxx::__ops::_Iter_less_iter]' D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/stl_algo.h:4861:18: required from 'void std::sort(_RAIter, _RAIter) [with _RAIter = __gnu_cxx::__normal_iterator<const int*, vector<int> >]' D:\clion\kexin\countMid\C++_multi_files_20251012165246089\solution.cpp:18:13: required from here D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/stl_heap.h:235:36: error: assignment of read-only location '__first.__gnu_cxx::__normal_iterator<const int*, std::vector<int> >::operator+(__holeIndex).__gnu_cxx::__normal_iterator<const int*, std::vector<int> >::operator*()' 235 | *(__first + __holeIndex) = _GLIBCXX_MOVE(*(__first + __secondChild)); | ^ D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/stl_heap.h:241:36: error: assignment of read-only location '__first.__gnu_cxx::__normal_iterator<const int*, std::vector<int> >::operator+(__holeIndex).__gnu_cxx::__normal_iterator<const int*, std::vector<int> >::operator*()' 241 | *(__first + __holeIndex) = _GLIBCXX_MOVE(*(__first | ^ D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/stl_algobase.h: In instantiation of 'static _Up* std::__copy_move_backward<_IsMove, true, std::random_access_iterator_tag>::__copy_move_b(_Tp*, _Tp*, _Up*) [with _Tp = const int; _Up = const int; bool _IsMove = true]': D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/stl_algobase.h:769:37: required from '_BI2 std::__copy_move_backward_a2(_BI1, _BI1, _BI2) [with bool _IsMove = true; _BI1 = const int*; _BI2 = const int*]' D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/stl_algobase.h:778:51: required from '_BI2 std::__copy_move_backward_a1(_BI1, _BI1, _BI2) [with bool _IsMove = true; _BI1 = const int*; _BI2 = const int*]' D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/stl_algobase.h:809:5: required from '_OI std::__copy_move_backward_a(_II, _II, _OI) [with bool _IsMove = true; _II = __gnu_cxx::__normal_iterator<const int*, vector<int> >; _OI = __gnu_cxx::__normal_iterator<const int*, vector<int> >]' D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/stl_algobase.h:901:47: required from '_BI2 std::move_backward(_BI1, _BI1, _BI2) [with _BI1 = __gnu_cxx::__normal_iterator<const int*, vector<int> >; _BI2 = __gnu_cxx::__normal_iterator<const int*, vector<int> >]' D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/stl_algo.h:1823:8: required from 'void std::__insertion_sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<const int*, vector<int> >; _Compare = __gnu_cxx::__ops::_Iter_less_iter]' D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/stl_algo.h:1859:25: required from 'void std::__final_insertion_sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<const int*, vector<int> >; _Compare = __gnu_cxx::__ops::_Iter_less_iter]' D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/stl_algo.h:1950:31: required from 'void std::__sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<const int*, vector<int> >; _Compare = __gnu_cxx::__ops::_Iter_less_iter]' D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/stl_algo.h:4861:18: required from 'void std::sort(_RAIter, _RAIter) [with _RAIter = __gnu_cxx::__normal_iterator<const int*, vector<int> >]' D:\clion\kexin\countMid\C++_multi_files_20251012165246089\solution.cpp:18:13: required from here D:/clion/CLion 2025.1.3/bin/mingw/lib/gcc/x86_64-w64-mingw32/13.1.0/include/c++/bits/stl_algobase.h:748:40: error: invalid conversion from 'const void*' to 'void*' [-fpermissive] 748 | __builtin_memmove(__result - _Num, __first, sizeof(_Tp) * _Num); | ~~~~~~~~~^~~~~~ | | | const void* <built-in>: note: initializing argument 1 of 'void* __builtin_memmove(void*, const void*, long long unsigned int)' 进程已结束,退出代码为 1 为什么构建失败
10-13
// 按车道序列号排序 (lane_seq从左到右递增) std::sort(section_lanes.begin(), section_lanes.end(), [](ConstLaneInfo a, ConstLaneInfo b) { return a->lane_seq < b->lane_seq; }); /usr/include/c++/9/bits/stl_algo.h:1973:25: required from ‘void std::__sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<const cem::message::env_model::LaneInfo* const*, std::vector<const cem::message::env_model::LaneInfo* const> >; _Compare = __gnu_cxx::__ops::_Iter_comp_iter<cem::fusion::navigation::SdNavigationHighway::GetEmergencyLaneInfo()::<lambda(ConstLaneInfo, ConstLaneInfo)> >]’ /usr/include/c++/9/bits/stl_algo.h:4905:18: required from ‘void std::sort(_RAIter, _RAIter, _Compare) [with _RAIter = __gnu_cxx::__normal_iterator<const cem::message::env_model::LaneInfo* const*, std::vector<const cem::message::env_model::LaneInfo* const> >; _Compare = cem::fusion::navigation::SdNavigationHighway::GetEmergencyLaneInfo()::<lambda(ConstLaneInfo, ConstLaneInfo)>]’ modules/perception/env/src/lib/sd_navigation/SdNavigationHighway.cpp:1974:16: required from here /usr/include/c++/9/bits/stl_heap.h:225:29: error: assignment of read-only location ‘__first.__gnu_cxx::__normal_iterator<const cem::message::env_model::LaneInfo* const*, std::vector<const cem::message::env_model::LaneInfo* const> >::operator+(__holeIndex).__gnu_cxx::__normal_iterator<const cem::message::env_model::LaneInfo* const*, std::vector<const cem::message::env_model::LaneInfo* const> >::operator*()’ 225 | *(__first + __holeIndex) = _GLIBCXX_MOVE(*(__first + __secondChild)); | ^ /usr/include/c++/9/bits/stl_heap.h:231:29: error: assignment of read-only location ‘__first.__gnu_cxx::__normal_iterator<const cem::message::env_model::LaneInfo* const*, std::vector<const cem::message::env_model::LaneInfo* const> >::operator+(__holeIndex).__gnu_cxx::__normal_iterator<const cem::message::env_model::LaneInfo* const*, std::vector<const cem::message::env_model::LaneInfo* const> >::operator*()’ 231 | *(__first + __holeIndex) = _GLIBCXX_MOVE(*(__first | ^ In file included from /usr/include/c++/9/bits/stl_tree.h:63, from /usr/include/c++/9/map:60, from modules/perception/env/src/lib/sd_navigation/SdNavigationHighway.h:4, from modules/perception/env/src/lib/sd_navigation/SdNavigationHighway.cpp:1: /usr/include/c++/9/bits/stl_algobase.h: In instantiation of ‘_BI2 std::__copy_move_backward_a(_BI1, _BI1, _BI2) [with bool _IsMove = true; _BI1 = const cem::message::env_model::LaneInfo* const*; _BI2 = const cem::message::env_model::LaneInfo* const*]’: /usr/include/c++/9/bits/stl_algobase.h:617:5: required from ‘_BI2 std::__copy_move_backward_a2(_BI1, _BI1, _BI2) [with bool _IsMove = true; _BI1 = __gnu_cxx::__normal_iterator<const cem::message::env_model::LaneInfo* const*, std::vector<const cem::message::env_model::LaneInfo* const> >; _BI2 = __gnu_cxx::__normal_iterator<const cem::message::env_model::LaneInfo* const*, std::vector<const cem::message::env_model::LaneInfo* const> >]’ /usr/include/c++/9/bits/stl_algobase.h:686:48: required from ‘_BI2 std::move_backward(_BI1, _BI1, _BI2) [with _BI1 = __gnu_cxx::__normal_iterator<const cem::message::env_model::LaneInfo* const*, std::vector<const cem::message::env_model::LaneInfo* const> >; _BI2 = __gnu_cxx::__normal_iterator<const cem::message::env_model::LaneInfo* const*, std::vector<const cem::message::env_model::LaneInfo* const> >]’ /usr/include/c++/9/bits/stl_algo.h:1856:8: required from ‘void std::__insertion_sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<const cem::message::env_model::LaneInfo* const*, std::vector<const cem::message::env_model::LaneInfo* const> >; _Compare = __gnu_cxx::__ops::_Iter_comp_iter<cem::fusion::navigation::SdNavigationHighway::GetEmergencyLaneInfo()::<lambda(ConstLaneInfo, ConstLaneInfo)> >]’ /usr/include/c++/9/bits/stl_algo.h:1890:25: required from ‘void std::__final_insertion_sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<const cem::message::env_model::LaneInfo* const*, std::vector<const cem::message::env_model::LaneInfo* const> >; _Compare = __gnu_cxx::__ops::_Iter_comp_iter<cem::fusion::navigation::SdNavigationHighway::GetEmergencyLaneInfo()::<lambda(ConstLaneInfo, ConstLaneInfo)> >]’ /usr/include/c++/9/bits/stl_algo.h:1976:31: required from ‘void std::__sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<const cem::message::env_model::LaneInfo* const*, std::vector<const cem::message::env_model::LaneInfo* const> >; _Compare = __gnu_cxx::__ops::_Iter_comp_iter<cem::fusion::navigation::SdNavigationHighway::GetEmergencyLaneInfo()::<lambda(ConstLaneInfo, ConstLaneInfo)> >]’ /usr/include/c++/9/bits/stl_algo.h:4905:18: required from ‘void std::sort(_RAIter, _RAIter, _Compare) [with _RAIter = __gnu_cxx::__normal_iterator<const cem::message::env_model::LaneInfo* const*, std::vector<const cem::message::env_model::LaneInfo* const> >; _Compare = cem::fusion::navigation::SdNavigationHighway::GetEmergencyLaneInfo()::<lambda(ConstLaneInfo, ConstLaneInfo)>]’ modules/perception/env/src/lib/sd_navigation/SdNavigationHighway.cpp:1974:16: required from here /usr/include/c++/9/bits/stl_algobase.h:606:37: error: no matching function for call to ‘std::__copy_move_backward<true, true, std::random_access_iterator_tag>::__copy_move_b(const cem::message::env_model::LaneInfo* const*&, const cem::message::env_model::LaneInfo* const*&, const cem::message::env_model::LaneInfo* const*&)’ 605 | return std::__copy_move_backward<_IsMove, __simple, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 606 | _Category>::__copy_move_b(__first, | ~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~ 607 | __last, | ~~~~~~~ 608 | __result); | ~~~~~~~~~ /usr/include/c++/9/bits/stl_algobase.h:577:2: note: candidate: ‘template<class _Tp> static _Tp* std::__copy_move_backward<_IsMove, true, std::random_access_iterator_tag>::__copy_move_b(const _Tp*, const _Tp*, _Tp*) [with _Tp = _Tp; bool _IsMove = true]’ 577 | __copy_move_b(const _Tp* __first, const _Tp* __last, _Tp* __result) | ^~~~~~~~~~~~~ /usr/include/c++/9/bits/stl_algobase.h:577:2: note: template argument deduction/substitution failed: /usr/include/c++/9/bits/stl_algobase.h:606:37: note: deduced conflicting types for parameter ‘_Tp’ (‘const cem::message::env_model::LaneInfo*’ and ‘const cem::message::env_model::LaneInfo* const’) 605 | return std::__copy_move_backward<_IsMove, __simple, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 606 | _Category>::__copy_move_b(__first, | ~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~ 607 | __last, | ~~~~~~~ 608 | __result); | ~~~~~~~~~
08-28
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值