如何解决使用自定义比较器对地图进行排序时出错
我正在尝试按行和列对稀疏矩阵的键进行排序,并且我想为此使用映射。我添加了一个自定义比较器来确保这一点,但是我遇到了以下编译错误:
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,_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> >; _Compare = compare_keys; _Alloc = std::allocator<std::pair<const std::pair<int,int> >; std::_Rb_tree<_Key,_Alloc>::const_iterator = std::_Rb_tree_const_iterator<std::pair<const std::pair<int,int> >]’:
/usr/include/c++/9/bits/stl_map.h:1215:31: required from ‘std::map<_Key,_Tp,_Alloc>::size_type std::map<_Key,_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> >; std::map<_Key,_Alloc>::size_type = long unsigned int; std::map<_Key,_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,_Alloc>::_M_lower_bound(std::_Rb_tree<_Key,_Alloc>::_Const_Link_type,std::_Rb_tree<_Key,_Alloc>::_Const_Base_ptr,const _Key&) const [with _Key = std::pair<int,_Alloc>::_Const_Link_type = const std::_Rb_tree_node<std::pair<const std::pair<int,int> >*; std::_Rb_tree<_Key,_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,int> >]’
/usr/include/c++/9/bits/stl_map.h:1215:31: required from ‘std::map<_Key,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>&)’
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& right_key) {
| ^~~~~~~~
Matrix.hh:6:10: note: passing ‘const compare_keys*’ as ‘this’ argument discards qualifiers
Matrix类:
#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
。
bool operator() (const key& left_key,const key& right_key) const {
^^^^^
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。