【发布时间】: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<存在,这里是否特别需要(略有不同的)订单?也可以看看map::try_emplace,可以简化emplace
标签: c++ sorting dictionary stl