【问题标题】:Error using custom comparator for sorting map使用自定义比较器对地图进行排序时出错
【发布时间】:2020-12-16 09:45:19
【问题描述】:

我正在尝试按行和列对稀疏矩阵的键进行排序,并且我想为此目的使用映射。我添加了一个自定义比较器来确保这一点,但我面临以下编译错误:

g++ -O2 -Wall -std=c++11 -Wextra -Wpedantic   -c -o main.o main.cpp
In file included from /usr/include/c++/9/map:60,
                 from Matrix.hh:1,
                 from main.cpp:3:
/usr/include/c++/9/bits/stl_tree.h: In instantiation of ‘std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::const_iterator std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::find(const _Key&) const [with _Key = std::pair<int, int>; _Val = std::pair<const std::pair<int, int>, int>; _KeyOfValue = std::_Select1st<std::pair<const std::pair<int, int>, int> >; _Compare = compare_keys; _Alloc = std::allocator<std::pair<const std::pair<int, int>, int> >; std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::const_iterator = std::_Rb_tree_const_iterator<std::pair<const std::pair<int, int>, int> >]’:
/usr/include/c++/9/bits/stl_map.h:1215:31:   required from ‘std::map<_Key, _Tp, _Compare, _Alloc>::size_type std::map<_Key, _Tp, _Compare, _Alloc>::count(const key_type&) const [with _Key = std::pair<int, int>; _Tp = int; _Compare = compare_keys; _Alloc = std::allocator<std::pair<const std::pair<int, int>, int> >; std::map<_Key, _Tp, _Compare, _Alloc>::size_type = long unsigned int; std::map<_Key, _Tp, _Compare, _Alloc>::key_type = std::pair<int, int>]’
Matrix.hh:23:9:   required from ‘bool Matrix<T>::emplace(int, int, T) [with T = int]’
main.cpp:7:5:   required from here
/usr/include/c++/9/bits/stl_tree.h:2572:8: error: no match for call to ‘(const compare_keys) (const std::pair<int, int>&, const std::pair<int, int>&)’
 2571 |       return (__j == end()
      |              ~~~~~~~~~~~~~
 2572 |        || _M_impl._M_key_compare(__k,
      |        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 2573 |      _S_key(__j._M_node))) ? end() : __j;
      |      ~~~~~~~~~~~~~~~~~~~~~
In file included from main.cpp:3:
Matrix.hh:6:10: note: candidate: ‘bool compare_keys::operator()(const key&, const key&)’ <near match>
    6 |     bool operator() (const key& left_key, const key& right_key) {
      |          ^~~~~~~~
Matrix.hh:6:10: note:   passing ‘const compare_keys*’ as ‘this’ argument discards qualifiers
In file included from /usr/include/c++/9/map:60,
                 from Matrix.hh:1,
                 from main.cpp:3:
/usr/include/c++/9/bits/stl_tree.h: In instantiation of ‘std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::const_iterator std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_M_lower_bound(std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_Const_Link_type, std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_Const_Base_ptr, const _Key&) const [with _Key = std::pair<int, int>; _Val = std::pair<const std::pair<int, int>, int>; _KeyOfValue = std::_Select1st<std::pair<const std::pair<int, int>, int> >; _Compare = compare_keys; _Alloc = std::allocator<std::pair<const std::pair<int, int>, int> >; std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::const_iterator = std::_Rb_tree_const_iterator<std::pair<const std::pair<int, int>, int> >; std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_Const_Link_type = const std::_Rb_tree_node<std::pair<const std::pair<int, int>, int> >*; std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_Const_Base_ptr = const std::_Rb_tree_node_base*]’:
/usr/include/c++/9/bits/stl_tree.h:2570:22:   required from ‘std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::const_iterator std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::find(const _Key&) const [with _Key = std::pair<int, int>; _Val = std::pair<const std::pair<int, int>, int>; _KeyOfValue = std::_Select1st<std::pair<const std::pair<int, int>, int> >; _Compare = compare_keys; _Alloc = std::allocator<std::pair<const std::pair<int, int>, int> >; std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::const_iterator = std::_Rb_tree_const_iterator<std::pair<const std::pair<int, int>, int> >]’
/usr/include/c++/9/bits/stl_map.h:1215:31:   required from ‘std::map<_Key, _Tp, _Compare, _Alloc>::size_type std::map<_Key, _Tp, _Compare, _Alloc>::count(const key_type&) const [with _Key = std::pair<int, int>; _Tp = int; _Compare = compare_keys; _Alloc = std::allocator<std::pair<const std::pair<int, int>, int> >; std::map<_Key, _Tp, _Compare, _Alloc>::size_type = long unsigned int; std::map<_Key, _Tp, _Compare, _Alloc>::key_type = std::pair<int, int>]’
Matrix.hh:23:9:   required from ‘bool Matrix<T>::emplace(int, int, T) [with T = int]’
main.cpp:7:5:   required from here
/usr/include/c++/9/bits/stl_tree.h:1945:6: error: no match for call to ‘(const compare_keys) (const std::pair<int, int>&, const std::pair<int, int>&)’
 1945 |  if (!_M_impl._M_key_compare(_S_key(__x), __k))
In file included from main.cpp:3:
Matrix.hh:6:10: note: candidate: ‘bool compare_keys::operator()(const key&, const key&)’ <near match>
    6 |     bool operator() (const key& left_key, const key& right_key) {
      |          ^~~~~~~~
Matrix.hh:6:10: note:   passing ‘const compare_keys*’ as ‘this’ argument discards qualifiers

矩阵类:

#include <map>
#include <iostream>

typedef std::pair<int,int> key;
struct compare_keys {
    bool operator() (const key& left_key, const key& right_key) {
        if (left_key.first < right_key.first) return true;
        if (left_key.first > right_key.first) return false;
        return left_key.second > right_key.second;
    }
};

template <typename T>
class Matrix {
private:
//Sparse matrix representation
    std::map<key, T, compare_keys> values;
    int max_row, max_col;
public:
    Matrix() : max_row(0), max_col(0) {};
    Matrix(int rows, int cols) : max_row(rows), max_col(cols) {};
    bool emplace(int row, int col, T value) {
        if (this->values.count(std::make_pair(row, col))) 
            return false;

        this->values[std::make_pair(row, col)] = value;
        if (row > max_row) max_row = row;
        if (col > max_col) max_col = col;
        return true;
    }

};

我不明白为什么 compare_keys 运算符与 map 构造函数中的比较器不匹配。

【问题讨论】:

  • 消息中最重要的部分是“不匹配调用 '(const compare_keys) (const std::pair&, const std: :pair&)'" (我的重点)和“将 'const compare_keys*' 作为 'this' 参数传递会丢弃限定符”。这是const 不匹配。
  • 你的比较函数需要是const
  • 旁白:std::pair::operator&lt; 存在,这里是否特别需要(略有不同的)订单?也可以看看map::try_emplace,可以简化emplace

标签: c++ sorting dictionary stl


【解决方案1】:

你错过了const

bool operator() (const key& left_key, const key& right_key) const {
                                                            ^^^^^

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-14
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多