STD::reverse_iterator

这篇博客探讨了std::reverse_iterator的概念,它是一个迭代器适配器,用于反转给定迭代器的方向。reverse_iterator从双向迭代器创建时,会提供一个从结束到开始的迭代顺序。内容中提到,对于由iterator构造的reverse_iterator,其关系&*r == &*(i-1)总是成立。reverse_iterator在++和--操作时的行为与常规相反,这使得它可以用于反向遍历序列。文章通过代码示例和参考资料帮助读者理解其工作原理。

阅读STL代码的时候,看到STD::reverse_iterator不是很懂,就查了一些资料。

std::reverse_iterator is an iterator adaptor that reverses the direction of a given iterator. In other words, when provided with a bidirectional iterator, std::reverse_iterator produces a new iterator that moves from the end to the beginning of the sequence defined by the underlying bidirectional iterator.

In file included from /usr/include/c++/11/bits/stl_algobase.h:71, from /usr/include/c++/11/bits/char_traits.h:39, from /usr/include/c++/11/ios:40, from /usr/include/c++/11/ostream:38, from /usr/include/c++/11/iostream:39, from a.cpp:1: /usr/include/c++/11/bits/predefined_ops.h: In instantiation of ‘constexpr bool __gnu_cxx::__ops::_Iter_less_iter::operator()(_Iterator1, _Iterator2) const [with _Iterator1 = __gnu_cxx::__normal_iterator<std::pair<double, Point>*, std::vector<std::pair<double, Point> > >; _Iterator2 = __gnu_cxx::__normal_iterator<std::pair<double, Point>*, std::vector<std::pair<double, Point> > >]’: /usr/include/c++/11/bits/stl_algo.h:5624:12: required from ‘constexpr _ForwardIterator std::__min_element(_ForwardIterator, _ForwardIterator, _Compare) [with _ForwardIterator = __gnu_cxx::__normal_iterator<std::pair<double, Point>*, std::vector<std::pair<double, Point> > >; _Compare = __gnu_cxx::__ops::_Iter_less_iter]’ /usr/include/c++/11/bits/stl_algo.h:5648:43: required from ‘constexpr _FIter std::min_element(_FIter, _FIter) [with _FIter = __gnu_cxx::__normal_iterator<std::pair<double, Point>*, std::vector<std::pair<double, Point> > >]’ a.cpp:46:27: required from here /usr/include/c++/11/bits/predefined_ops.h:45:23: error: no match for ‘operator<’ (operand types are ‘std::pair<double, Point>’ and ‘std::pair<double, Point>’) 45 | { return *__it1 < *__it2; } | ~~~~~~~^~~~~~~~ In file included from /usr/include/c++/11/bits/stl_algobase.h:67, from /usr/include/c++/11/bits/char_traits.h:39, from /usr/include/c++/11/ios:40, from /usr/include/c++/11/ostream:38, from /usr/include/c++/11/iostream:39, from a.cpp:1: /usr/include/c++/11/bits/stl_iterator.h:1129:5: note: candidate: ‘template<class _IteratorL, class _IteratorR, class _Container> constexpr std::__detail::__synth3way_t<_IteratorR, _IteratorL> __gnu_cxx::operator<=>(const __gnu_cxx::__normal_iterator<_IteratorL, _Container>&, const __gnu_cxx::__normal_iterator<_IteratorR, _Container>&)’ (reversed) 1129 | operator<=>(const __normal_iterator<_IteratorL, _Container>& __lhs, | ^~~~~~~~ /usr/include/c++/11/bits/stl_iterator.h:1129:5: note: template argument deduction/substitution failed: In file included from /usr/include/c++/11/bits/stl_algobase.h:71, from /usr/include/c++/11/bits/char_traits.h:39, from /usr/include/c++/11/ios:40, from /usr/include/c++/11/ostream:38, from /usr/include/c++/11/iostream:39, from a.cpp:1: /usr/include/c++/11/bits/predefined_ops.h:45:23: note:std::pair<double, Point>’ is not derived from ‘const __gnu_cxx::__normal_iterator<_IteratorL, _Container>’ 45 | { return *__it1 < *__it2; } | ~~~~~~~^~~~~~~~ In file included from /usr/include/c++/11/bits/stl_algobase.h:67, from /usr/include/c++/11/bits/char_traits.h:39, from /usr/include/c++/11/ios:40, from /usr/include/c++/11/ostream:38, from /usr/include/c++/11/iostream:39, from a.cpp:1: /usr/include/c++/11/bits/stl_iterator.h:538:5: note: candidate: ‘template<class _IteratorL, class _IteratorR> requires three_way_comparable_with<_IteratorR, _IteratorL, std::partial_ordering> constexpr std::compare_three_way_result_t<_IteratorL, _IteratorR> std::operator<=>(const std::reverse_iterator<_IteratorL>&, const std::reverse_iterator<_IteratorR>&)’ (reversed) 538 | operator<=>(const reverse_iterator<_IteratorL>& __x, | ^~~~~~~~ /usr/include/c++/11/bits/stl_iterator.h:538:5: note: template argument deduction/substitution failed: In file included from /usr/include/c++/11/bits/stl_algobase.h:71, from /usr/include/c++/11/bits/char_traits.h:39, from /usr/include/c++/11/ios:40, from /usr/include/c++/11/ostream:38, from /usr/include/c++/11/iostream:39, from a.cpp:1: /usr/include/c++/11/bits/predefined_ops.h:45:23: note:std::pair<double, Point>’ is not derived from ‘const std::reverse_iterator<_IteratorL>’ 45 | { return *__it1 < *__it2; } | ~~~~~~~^~~~~~~~ In file included from /usr/include/c++/11/bits/stl_algobase.h:67, from /usr/include/c++/11/bits/char_traits.h:39, from /usr/include/c++/11/ios:40, from /usr/include/c++/11/ostream:38, from /usr/include/c++/11/iostream:39, from a.cpp:1: /usr/include/c++/11/bits/stl_iterator.h:1596:5: note: candidate: ‘template<class _IteratorL, class _IteratorR> requires three_way_comparable_with<_IteratorR, _IteratorL, std::partial_ordering> constexpr std::compare_three_way_result_t<_IteratorL, _IteratorR> std::operator<=>(const std::move_iterator<_IteratorL>&, const std::move_iterator<_IteratorR>&)’ (reversed) 1596 | operator<=>(const move_iterator<_IteratorL>& __x, | ^~~~~~~~ /usr/include/c++/11/bits/stl_iterator.h:1596:5: note: template argument deduction/substitution failed: In file included from /usr/include/c++/11/bits/stl_algobase.h:71, from /usr/include/c++/11/bits/char_traits.h:39, from /usr/include/c++/11/ios:40, from /usr/include/c++/11/ostream:38, from /usr/include/c++/11/iostream:39, from a.cpp:1: /usr/include/c++/11/bits/predefined_ops.h:45:23: note:std::pair<double, Point>’ is not derived from ‘const std::move_iterator<_IteratorL>’ 45 | { return *__it1 < *__it2; } | ~~~~~~~^~~~~~~~ In file included from /usr/include/c++/11/bits/basic_string.h:48, from /usr/include/c++/11/string:55, from /usr/include/c++/11/bits/locale_classes.h:40, from /usr/include/c++/11/bits/ios_base.h:41, from /usr/include/c++/11/ios:42, from /usr/include/c++/11/ostream:38, from /usr/include/c++/11/iostream:39, from a.cpp:1: /usr/include/c++/11/string_view:556:5: note: candidate: ‘template<class _CharT, class _Traits> constexpr decltype (__char_traits_cmp_cat<_Traits>(0)) std::operator<=>(std::basic_string_view<_CharT, _Traits>, std::__type_identity_t<std::basic_string_view<_CharT, _Traits> >)’ (reversed) 556 | operator<=>(basic_string_view<_CharT, _Traits> __x, | ^~~~~~~~ /usr/include/c++/11/string_view:556:5: note: template argument deduction/substitution failed: In file included from /usr/include/c++/11/bits/stl_algobase.h:71, from /usr/include/c++/11/bits/char_traits.h:39, from /usr/include/c++/11/ios:40, from /usr/include/c++/11/ostream:38, from /usr/include/c++/11/iostream:39, from a.cpp:1: /usr/include/c++/11/bits/predefined_ops.h:45:23: note:std::pair<double, Point>’ is not derived from ‘std::basic_string_view<_CharT, _Traits>’ 45 | { return *__it1 < *__it2; } | ~~~~~~~^~~~~~~~ In file included from /usr/include/c++/11/string:55, from /usr/include/c++/11/bits/locale_classes.h:40, from /usr/include/c++/11/bits/ios_base.h:41, from /usr/include/c++/11/ios:42, from /usr/include/c++/11/ostream:38, from /usr/include/c++/11/iostream:39, from a.cpp:1: /usr/include/c++/11/bits/basic_string.h:6276:5: note: candidate: ‘template<class _CharT, class _Traits, class _Alloc> decltype (__char_traits_cmp_cat<_Traits>(0)) std::operator<=>(const std::__cxx11::basic_string<_CharT, _Traits, _Allocator>&, const _CharT*)’ (reversed) 6276 | operator<=>(const basic_string<_CharT, _Traits, _Alloc>& __lhs, | ^~~~~~~~ /usr/include/c++/11/bits/basic_string.h:6276:5: note: template argument deduction/substitution failed: In file included from /usr/include/c++/11/bits/stl_algobase.h:71, from /usr/include/c++/11/bits/char_traits.h:39, from /usr/include/c++/11/ios:40, from /usr/include/c++/11/ostream:38, from /usr/include/c++/11/iostream:39, from a.cpp:1: /usr/include/c++/11/bits/predefined_ops.h:45:23: note:std::pair<double, Point>’ is not derived from ‘const std::__cxx11::basic_string<_CharT, _Traits, _Allocator>’ 45 | { return *__it1 < *__it2; } | ~~~~~~~^~~~~~~~ In file included from /usr/include/c++/11/bits/unique_ptr.h:37, from /usr/include/c++/11/bits/locale_conv.h:41, from /usr/include/c++/11/locale:43, from /usr/include/c++/11/iomanip:43, from a.cpp:4: /usr/include/c++/11/tuple:1557:5: note: candidate: ‘template<class ... _Tps, class ... _Ups> constexpr std::common_comparison_category_t<decltype (std::__detail::__synth3way(declval<_Tps&>(), declval<_Ups&>()))...> std::operator<=>(const std::tuple<_Tps ...>&, const std::tuple<_UTypes ...>&)’ (reversed) 1557 | operator<=>(const tuple<_Tps...>& __t, const tuple<_Ups...>& __u) | ^~~~~~~~ /usr/include/c++/11/tuple:1557:5: note: template argument deduction/substitution failed: In file included from /usr/include/c++/11/bits/stl_algobase.h:71, from /usr/include/c++/11/bits/char_traits.h:39, from /usr/include/c++/11/ios:40, from /usr/include/c++/11/ostream:38, from /usr/include/c++/11/iostream:39, from a.cpp:1: /usr/include/c++/11/bits/predefined_ops.h:45:23: note:std::pair<double, Point>’ is not derived from ‘const std::tuple<_Tps ...>’ 45 | { return *__it1 < *__it2; } | ~~~~~~~^~~~~~~~ In file included from /usr/include/c++/11/bits/locale_conv.h:41, from /usr/include/c++/11/locale:43, from /usr/include/c++/11/iomanip:43, from a.cpp:4: /usr/include/c++/11/bits/unique_ptr.h:895:5: note: candidate: ‘template<class _Tp, class _Dp, class _Up, class _Ep> requires three_way_comparable_with<typename std::unique_ptr<_Tp, _Dp>::pointer, typename std::unique_ptr<_Up, _Ep>::pointer, std::partial_ordering> std::compare_three_way_result_t<typename std::unique_ptr<_Tp, _Dp>::pointer, typename std::unique_ptr<_Up, _Ep>::pointer> std::operator<=>(const std::unique_ptr<_Tp, _Dp>&, const std::unique_ptr<_Up, _Ep>&)’ (reversed) 895 | operator<=>(const unique_ptr<_Tp, _Dp>& __x, | ^~~~~~~~ /usr/include/c++/11/bits/unique_ptr.h:895:5: note: template argument deduction/substitution failed: In file included from /usr/include/c++/11/bits/stl_algobase.h:71, from /usr/include/c++/11/bits/char_traits.h:39, from /usr/include/c++/11/ios:40, from /usr/include/c++/11/ostream:38, from /usr/include/c++/11/iostream:39, from a.cpp:1: /usr/include/c++/11/bits/predefined_ops.h:45:23: note:std::pair<double, Point>’ is not derived from ‘const std::unique_ptr<_Tp, _Dp>’ 45 | { return *__it1 < *__it2; } | ~~~~~~~^~~~~~~~ In file included from /usr/include/c++/11/bits/locale_conv.h:41, from /usr/include/c++/11/locale:43, from /usr/include/c++/11/iomanip:43, from a.cpp:4: /usr/include/c++/11/bits/unique_ptr.h:903:5: note: candidate: ‘template<class _Tp, class _Dp> requires three_way_comparable<typename std::unique_ptr<_Tp, _Dp>::pointer, std::partial_ordering> std::compare_three_way_result_t<typename std::unique_ptr<_Tp, _Dp>::pointer> std::operator<=>(const std::unique_ptr<_Tp, _Dp>&, std::nullptr_t)’ (reversed) 903 | operator<=>(const unique_ptr<_Tp, _Dp>& __x, nullptr_t) | ^~~~~~~~ /usr/include/c++/11/bits/unique_ptr.h:903:5: note: template argument deduction/substitution failed: In file included from /usr/include/c++/11/bits/stl_algobase.h:71, from /usr/include/c++/11/bits/char_traits.h:39, from /usr/include/c++/11/ios:40, from /usr/include/c++/11/ostream:38, from /usr/include/c++/11/iostream:39, from a.cpp:1: /usr/include/c++/11/bits/predefined_ops.h:45:23: note:std::pair<double, Point>’ is not derived from ‘const std::unique_ptr<_Tp, _Dp>’ 45 | { return *__it1 < *__it2; } | ~~~~~~~^~~~~~~~ In file included from /usr/include/c++/11/bits/stl_algobase.h:67, from /usr/include/c++/11/bits/char_traits.h:39, from /usr/include/c++/11/ios:40, from /usr/include/c++/11/ostream:38, from /usr/include/c++/11/iostream:39, from a.cpp:1: /usr/include/c++/11/bits/stl_iterator.h:1146:5: note: candidate: ‘template<class _Iterator, class _Container> constexpr std::__detail::__synth3way_t<_T1> __gnu_cxx::operator<=>(const __gnu_cxx::__normal_iterator<_Iterator, _Container>&, const __gnu_cxx::__normal_iterator<_Iterator, _Container>&)’ (rewritten) 1146 | operator<=>(const __normal_iterator<_Iterator, _Container>& __lhs, | ^~~~~~~~ /usr/include/c++/11/bits/stl_iterator.h:1146:5: note: template argument deduction/substitution failed: In file included from /usr/include/c++/11/bits/stl_algobase.h:71, from /usr/include/c++/11/bits/char_traits.h:39, from /usr/include/c++/11/ios:40, from /usr/include/c++/11/ostream:38, from /usr/include/c++/11/iostream:39, from a.cpp:1: /usr/include/c++/11/bits/predefined_ops.h:45:23: note:std::pair<double, Point>’ is not derived from ‘const __gnu_cxx::__normal_iterator<_Iterator, _Container>’ 45 | { return *__it1 < *__it2; } | ~~~~~~~^~~~~~~~ In file included from /usr/include/c++/11/bits/stl_algobase.h:64, from /usr/include/c++/11/bits/char_traits.h:39, from /usr/include/c++/11/ios:40, from /usr/include/c++/11/ostream:38, from /usr/include/c++/11/iostream:39, from a.cpp:1: /usr/include/c++/11/bits/stl_pair.h:473:5: note: candidate: ‘template<class _T1, class _T2> constexpr std::common_comparison_category_t<decltype (std::__detail::__synth3way(declval<_T1&>(), declval<_T1&>())), decltype (std::__detail::__synth3way(declval<_T2&>(), declval<_T2&>()))> std::operator<=>(const std::pair<_T1, _T2>&, const std::pair<_T1, _T2>&)’ (rewritten) 473 | operator<=>(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y) | ^~~~~~~~ /usr/include/c++/11/bits/stl_pair.h:473:5: note: template argument deduction/substitution failed: In file included from /usr/include/c++/11/bits/stl_pair.h:65, from /usr/include/c++/11/bits/stl_algobase.h:64, from /usr/include/c++/11/bits/char_traits.h:39, from /usr/include/c++/11/ios:40, from /usr/include/c++/11/ostream:38, from /usr/include/c++/11/iostream:39, from a.cpp:1: /usr/include/c++/11/compare: In substitution of ‘template<class _T1, class _T2> constexpr std::common_comparison_category_t<decltype (std::__detail::__synth3way(declval<_T1&>(), declval<_T1&>())), decltype (std::__detail::__synth3way(declval<_T2&>(), declval<_T2&>()))> std::operator<=>(const std::pair<_T1, _T2>&, const std::pair<_T1, _T2>&) [with _T1 = double; _T2 = Point]’: /usr/include/c++/11/bits/predefined_ops.h:45:23: required from ‘constexpr bool __gnu_cxx::__ops::_Iter_less_iter::operator()(_Iterator1, _Iterator2) const [with _Iterator1 = __gnu_cxx::__normal_iterator<std::pair<double, Point>*, std::vector<std::pair<double, Point> > >; _Iterator2 = __gnu_cxx::__normal_iterator<std::pair<double, Point>*, std::vector<std::pair<double, Point> > >]’ /usr/include/c++/11/bits/stl_algo.h:5624:12: required from ‘constexpr _ForwardIterator std::__min_element(_ForwardIterator, _ForwardIterator, _Compare) [with _ForwardIterator = __gnu_cxx::__normal_iterator<std::pair<double, Point>*, std::vector<std::pair<double, Point> > >; _Compare = __gnu_cxx::__ops::_Iter_less_iter]’ /usr/include/c++/11/bits/stl_algo.h:5648:43: required from ‘constexpr _FIter std::min_element(_FIter, _FIter) [with _FIter = __gnu_cxx::__normal_iterator<std::pair<double, Point>*, std::vector<std::pair<double, Point> > >]’ a.cpp:46:27: required from here /usr/include/c++/11/compare:915:41: error: no match for call to ‘(const std::__detail::_Synth3way) (Point&, Point&)’ 915 | = decltype(__detail::__synth3way(std::declval<_Tp&>(), | ~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~ 916 | std::declval<_Up&>())); | ~~~~~~~~~~~~~~~~~~~~~ /usr/include/c++/11/compare:890:9: note: candidate: ‘template<class _Tp, class _Up> constexpr auto std::__detail::_Synth3way::operator()(const _Tp&, const _Up&) const requires requires{{std::__detail::_Synth3way::operator()::__t < std::__detail::_Synth3way::operator()::__u} -> decltype(auto) [requires std::__detail::__boolean_testable<<placeholder>, >];{std::__detail::_Synth3way::operator()::__u < std::__detail::_Synth3way::operator()::__t} -> decltype(auto) [requires std::__detail::__boolean_testable<<placeholder>, >];}’ 890 | operator()(const _Tp& __t, const _Up& __u) const | ^~~~~~~~ /usr/include/c++/11/compare:890:9: note: template argument deduction/substitution failed: /usr/include/c++/11/compare:890:9: note: constraints not satisfied /usr/include/c++/11/compare: In substitution of ‘template<class _Tp, class _Up> constexpr auto std::__detail::_Synth3way::operator()(const _Tp&, const _Up&) const requires requires{{__t < __u} -> decltype(auto) [requires std::__detail::__boolean_testable<<placeholder>, >];{__u < __t} -> decltype(auto) [requires std::__detail::__boolean_testable<<placeholder>, >];} [with _Tp = Point; _Up = Point]’: /usr/include/c++/11/compare:915:34: required by substitution of ‘template<class _T1, class _T2> constexpr std::common_comparison_category_t<decltype (std::__detail::__synth3way(declval<_T1&>(), declval<_T1&>())), decltype (std::__detail::__synth3way(declval<_T2&>(), declval<_T2&>()))> std::operator<=>(const std::pair<_T1, _T2>&, const std::pair<_T1, _T2>&) [with _T1 = double; _T2 = Point]’ /usr/include/c++/11/bits/predefined_ops.h:45:23: required from ‘constexpr bool __gnu_cxx::__ops::_Iter_less_iter::operator()(_Iterator1, _Iterator2) const [with _Iterator1 = __gnu_cxx::__normal_iterator<std::pair<double, Point>*, std::vector<std::pair<double, Point> > >; _Iterator2 = __gnu_cxx::__normal_iterator<std::pair<double, Point>*, std::vector<std::pair<double, Point> > >]’ /usr/include/c++/11/bits/stl_algo.h:5624:12: required from ‘constexpr _ForwardIterator std::__min_element(_ForwardIterator, _ForwardIterator, _Compare) [with _ForwardIterator = __gnu_cxx::__normal_iterator<std::pair<double, Point>*, std::vector<std::pair<double, Point> > >; _Compare = __gnu_cxx::__ops::_Iter_less_iter]’ /usr/include/c++/11/bits/stl_algo.h:5648:43: required from ‘constexpr _FIter std::min_element(_FIter, _FIter) [with _FIter = __gnu_cxx::__normal_iterator<std::pair<double, Point>*, std::vector<std::pair<double, Point> > >]’ a.cpp:46:27: required from here /usr/include/c++/11/compare:890:2: required by the constraints of ‘template<class _Tp, class _Up> constexpr auto std::__detail::_Synth3way::operator()(const _Tp&, const _Up&) const requires requires{{__t < __u} -> decltype(auto) [requires std::__detail::__boolean_testable<<placeholder>, >];{__u < __t} -> decltype(auto) [requires std::__detail::__boolean_testable<<placeholder>, >];}’ /usr/include/c++/11/compare:892:11: in requirements [with _Up = Point; _Tp = Point] /usr/include/c++/11/compare:894:17: note: the required expression ‘(__t < __u)’ is invalid 894 | { __t < __u } -> __boolean_testable; | ~~~~^~~~~ /usr/include/c++/11/compare:895:17: note: the required expression ‘(__u < __t)’ is invalid 895 | { __u < __t } -> __boolean_testable; | ~~~~^~~~~ /usr/include/c++/11/compare: In substitution of ‘template<class _T1, class _T2> constexpr std::common_comparison_category_t<decltype (std::__detail::__synth3way(declval<_T1&>(), declval<_T1&>())), decltype (std::__detail::__synth3way(declval<_T2&>(), declval<_T2&>()))> std::operator<=>(const std::pair<_T1, _T2>&, const std::pair<_T1, _T2>&) [with _T1 = double; _T2 = Point]’: /usr/include/c++/11/bits/predefined_ops.h:45:23: required from ‘constexpr bool __gnu_cxx::__ops::_Iter_less_iter::operator()(_Iterator1, _Iterator2) const [with _Iterator1 = __gnu_cxx::__normal_iterator<std::pair<double, Point>*, std::vector<std::pair<double, Point> > >; _Iterator2 = __gnu_cxx::__normal_iterator<std::pair<double, Point>*, std::vector<std::pair<double, Point> > >]’ /usr/include/c++/11/bits/stl_algo.h:5624:12: required from ‘constexpr _ForwardIterator std::__min_element(_ForwardIterator, _ForwardIterator, _Compare) [with _ForwardIterator = __gnu_cxx::__normal_iterator<std::pair<double, Point>*, std::vector<std::pair<double, Point> > >; _Compare = __gnu_cxx::__ops::_Iter_less_iter]’ /usr/include/c++/11/bits/stl_algo.h:5648:43: required from ‘constexpr _FIter std::min_element(_FIter, _FIter) [with _FIter = __gnu_cxx::__normal_iterator<std::pair<double, Point>*, std::vector<std::pair<double, Point> > >]’ a.cpp:46:27: required from here cc1plus: note: set ‘-fconcepts-diagnostics-depth=’ to at least 2 for more detail In file included from /usr/include/c++/11/bits/stl_algobase.h:67, from /usr/include/c++/11/bits/char_traits.h:39, from /usr/include/c++/11/ios:40, from /usr/include/c++/11/ostream:38, from /usr/include/c++/11/iostream:39, from a.cpp:1: /usr/include/c++/11/bits/predefined_ops.h: In instantiation of ‘constexpr bool __gnu_cxx::__ops::_Iter_less_iter::operator()(_Iterator1, _Iterator2) const [with _Iterator1 = __gnu_cxx::__normal_iterator<std::pair<double, Point>*, std::vector<std::pair<double, Point> > >; _Iterator2 = __gnu_cxx::__normal_iterator<std::pair<double, Point>*, std::vector<std::pair<double, Point> > >]’: /usr/include/c++/11/bits/stl_algo.h:5624:12: required from ‘constexpr _ForwardIterator std::__min_element(_ForwardIterator, _ForwardIterator, _Compare) [with _ForwardIterator = __gnu_cxx::__normal_iterator<std::pair<double, Point>*, std::vector<std::pair<double, Point> > >; _Compare = __gnu_cxx::__ops::_Iter_less_iter]’ /usr/include/c++/11/bits/stl_algo.h:5648:43: required from ‘constexpr _FIter std::min_element(_FIter, _FIter) [with _FIter = __gnu_cxx::__normal_iterator<std::pair<double, Point>*, std::vector<std::pair<double, Point> > >]’ a.cpp:46:27: required from here /usr/include/c++/11/bits/stl_iterator.h:554:5: note: candidate: ‘template<class _Iterator> requires three_way_comparable<_Iterator, std::partial_ordering> constexpr std::compare_three_way_result_t<_Iterator, _Iterator> std::operator<=>(const std::reverse_iterator<_IteratorL>&, const std::reverse_iterator<_IteratorL>&)’ (rewritten) 554 | operator<=>(const reverse_iterator<_Iterator>& __x, | ^~~~~~~~ /usr/include/c++/11/bits/stl_iterator.h:554:5: note: template argument deduction/substitution failed: In file included from /usr/include/c++/11/bits/stl_algobase.h:71, from /usr/include/c++/11/bits/char_traits.h:39, from /usr/include/c++/11/ios:40, from /usr/include/c++/11/ostream:38, from /usr/include/c++/11/iostream:39, from a.cpp:1: /usr/include/c++/11/bits/predefined_ops.h:45:23: note:std::pair<double, Point>’ is not derived from ‘const std::reverse_iterator<_IteratorL>’ 45 | { return *__it1 < *__it2; } | ~~~~~~~^~~~~~~~ In file included from /usr/include/c++/11/bits/stl_algobase.h:67, from /usr/include/c++/11/bits/char_traits.h:39, from /usr/include/c++/11/ios:40, from /usr/include/c++/11/ostream:38, from /usr/include/c++/11/iostream:39, from a.cpp:1: /usr/include/c++/11/bits/stl_iterator.h:1655:5: note: candidate: ‘template<class _Iterator> requires three_way_comparable<_Iterator, std::partial_ordering> constexpr std::compare_three_way_result_t<_Iterator, _Iterator> std::operator<=>(const std::move_iterator<_IteratorL>&, const std::move_iterator<_IteratorL>&)’ (rewritten) 1655 | operator<=>(const move_iterator<_Iterator>& __x, | ^~~~~~~~ /usr/include/c++/11/bits/stl_iterator.h:1655:5: note: template argument deduction/substitution failed: In file included from /usr/include/c++/11/bits/stl_algobase.h:71, from /usr/include/c++/11/bits/char_traits.h:39, from /usr/include/c++/11/ios:40, from /usr/include/c++/11/ostream:38, from /usr/include/c++/11/iostream:39, from a.cpp:1: /usr/include/c++/11/bits/predefined_ops.h:45:23: note:std::pair<double, Point>’ is not derived from ‘const std::move_iterator<_IteratorL>’根据报错修改
最新发布
01-04
// 答题框内的代码仅为待实现代码,执行或提交代码时,仅包含待实现部分,不要包含其它代码。 // CodeCheck/Cmetrics工具也仅扫描待实现部分。 // 若需要完整框架用于本地调试,请点击答题框上面的“下载完整框架代码”进行下载。 #include <string> #include <vector> #include <map> using namespace std; struct Compare { bool operator()(const pair<int, vector<int>>& p1, const pair<int, vector<int>>& p2) const{ if ( p1.first != p2.first) { return p1.first < p2.first; } else { for (int i = 0 ; i < p1.second.size(); ++i) { if ((p1.second)[i] != (p2.second)[i]) return (p1.second)[i] < (p2.second)[i]; } } return false; } }; class MiniDb { private: map<int, pair<int, string>> keyMap; map<pair<int, vector<int>>, vector<int>, Compare> dataMap; public: MiniDb() { } void Create(int tableId, int colNum, const string& keys) { //pair<int, string> p = {colNum, keys}; //keyMap.insert(tableId, p); } void Insert(int tableId, const vector<int>& values) { auto it = keyMap.find(tableId); if (it != keyMap.end()) { vector<int> mark; for (int i = 0; i < ((it->second).second).size(); ++i) { mark.emplace_back(values[((it->second).second)[i] - 'a']); } pair<int, vector<int>> p = {tableId, mark}; dataMap[p] = values; } } vector<vector<int>> Select(int tableId, const vector<string>& conditions) { vector<vector<int>> result; for (auto it = dataMap.begin(); it != dataMap.end(); ++it) { if (it->first.first == tableId) { result.emplace_back(it->second); } } int num = result.size(); for (int i = 0; i < conditions.size(); ++i) { int key = conditions[i] - 'a'; int value = std::stoi(conditions[i].substr(2, conditions[i].size() - 2)); int mark = 0; for (int i = 0; i < num; ++i) { if (result[i][key] == value) { result[mark] == result[i]; mark++; } } num = mark; } vector<vector<int>> resultLast; for (int i = 0; i < num; ++i) { resultLast[i] = result[i]; } return resultLast; } }; 运行时报错main.cpp: In member function 'std::vector<std::vector<int> > MiniDb::Select(int, const std::vector<std::__cxx11::basic_string<char> >&)': main.cpp:75:37: error: no match for 'operator-' (operand types are 'const value_type' {aka 'const std::__cxx11::basic_string<char>'} and 'char') int key = conditions[i] - 'a'; In file included from /usr/include/c++/8/bits/stl_algobase.h:67, from /usr/include/c++/8/bits/char_traits.h:39, from /usr/include/c++/8/ios:40, from main.cpp:6: /usr/include/c++/8/bits/stl_iterator.h:392:5: note: candidate: 'template<class _IteratorL, class _IteratorR> constexpr decltype ((__y.base() - __x.base())) std::operator-(const std::reverse_iterator<_Iterator>&, const std::reverse_iterator<_IteratorR>&)' operator-(const reverse_iterator<_IteratorL>& __x, ^~~~~~~~ /usr/include/c++/8/bits/stl_iterator.h:392:5: note: template argument deduction/substitution failed: main.cpp:75:39: note: 'const value_type' {aka 'const std::__cxx11::basic_string<char>'} is not derived from 'const std::reverse_iterator<_Iterator>' int key = conditions[i] - 'a'; ^~~ In file included from /usr/include/c++/8/bits/stl_algobase.h:67, from /usr/include/c++/8/bits/char_traits.h:39, from /usr/include/c++/8/ios:40, from main.cpp:6: /usr/include/c++/8/bits/stl_iterator.h:1188:5: note: candidate: 'template<class _IteratorL, class _IteratorR> constexpr decltype ((__x.base() - __y.base())) std::operator-(const std::move_iterator<_IteratorL>&, const std::move_iterator<_IteratorR>&)' operator-(const move_iterator<_IteratorL>& __x, ^~~~~~~~ /usr/include/c++/8/bits/stl_iterator.h:1188:5: note: template argument deduction/substitution failed: main.cpp:75:39: note: 'const value_type' {aka 'const std::__cxx11::basic_string<char>'} is not derived from 'const std::move_iterator<_IteratorL>' int key = conditions[i] - 'a'; ^~~ In file included from /usr/include/c++/8/vector:65, from main.cpp:19: /usr/include/c++/8/bits/stl_bvector.h:210:3: note: candidate: 'std::ptrdiff_t std::operator-(const std::_Bit_iterator_base&, const std::_Bit_iterator_base&)' operator-(const _Bit_iterator_base& __x, const _Bit_iterator_base& __y) ^~~~~~~~ /usr/include/c++/8/bits/stl_bvector.h:210:3: note: no known conversion for argument 1 from 'const value_type' {aka 'const std::__cxx11::basic_string<char>'} to 'const std::_Bit_iterator_base&' In file included from /usr/include/c++/8/bits/stl_algobase.h:67, from /usr/include/c++/8/bits/char_traits.h:39, from /usr/include/c++/8/ios:40, from main.cpp:6: /usr/include/c++/8/bits/stl_iterator.h:954:5: note: candidate: 'template<class _IteratorL, class _IteratorR, class _Container> decltype ((__lhs.base() - __rhs.base())) __gnu_cxx::operator-(const __gnu_cxx::__normal_iterator<_IteratorL, _Container>&, const __gnu_cxx::__normal_iterator<_IteratorR, _Container>&)' operator-(const __normal_iterator<_IteratorL, _Container>& __lhs, ^~~~~~~~ /usr/include/c++/8/bits/stl_iterator.h:954:5: note: template argument deduction/substitution failed: main.cpp:75:39: note: 'const value_type' {aka 'const std::__cxx11::basic_string<char>'} is not derived from 'const __gnu_cxx::__normal_iterator<_IteratorL, _Container>' int key = conditions[i] - 'a'; ^~~ In file included from /usr/include/c++/8/bits/stl_algobase.h:67, from /usr/include/c++/8/bits/char_traits.h:39, from /usr/include/c++/8/ios:40, from main.cpp:6: /usr/include/c++/8/bits/stl_iterator.h:966:5: note: candidate: 'template<class _Iterator, class _Container> typename __gnu_cxx::__normal_iterator<_Iterator, _Container>::difference_type __gnu_cxx::operator-(const __gnu_cxx::__normal_iterator<_Iterator, _Container>&, const __gnu_cxx::__normal_iterator<_Iterator, _Container>&)' operator-(const __normal_iterator<_Iterator, _Container>& __lhs, ^~~~~~~~ /usr/include/c++/8/bits/stl_iterator.h:966:5: note: template argument deduction/substitution failed: main.cpp:75:39: note: 'const value_type' {aka 'const std::__cxx11::basic_string<char>'} is not derived from 'const __gnu_cxx::__normal_iterator<_Iterator, _Container>' int key = conditions[i] - 'a'; ^~~
06-04
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值