我在C ++中创建一个std::map<int, int>
,我希望他们将键从最高到最低排序,而不是默认的排序顺序。我的研究引导我std::greater看起来很有希望,但在尝试使用它时,我遇到了编译错误:
一元'*'的无效类型参数(有'int')
我的地图声明是:
std::map<int, int, std::greater<int> > numMap;
错误是从这个函数抛出的:
void Row::addNumber(int num, int pos) {
numMap.insert(num, pos);
}
this等类似问题的答案包括声明中的括号,即std :: greater () - 但是当我包含这些问题时,我会收到有关返回函数的函数的多个错误
答案 0 :(得分:7)
问题 - 使用无效参数调用std::map::insert
成员函数:提供了两个整数值;但必须 std::pair<int, int>
。请参阅参考资料:std::map::insert。
对于方便(仅不重复地图类型参数),为地图创建typedef
:
typedef std::map<int, int> IntMap;
std::map
具有std::pair
的类型定义(配对表示) - std::map::value_type
。
因此,例如,如果std::map<int, int>
std::map::value_type
std::pair<int, int>
为std::map::value_type
。
使用IntMap::value_type
构造函数(在这种情况下为class Row {
public:
void Row::addNumber(int num, int pos)
{
m_numMap.insert(IntMap::value_type(num, pos));
}
private:
typedef std::map<int, int> IntMap;
IntMap m_numMap;
};
):
std::make_pair()
使用#include <utility>
...
void Row::addNumber(int num, int pos)
{
numMap.insert(std::make_pair(num, pos));
}
功能:
std::pair
直接使用void Row::addNumber(int num, int pos)
{
numMap.insert(std::pair<int, int>(num, pos));
}
构造函数:
{{1}}
答案 1 :(得分:5)
比谢尔盖的答案(这也肯定有效)更迂腐,而不是使用:
typedef std::map<int, int, std::greater<int> > MyMap;
MyMap numMap;
void Row::addNumber(int num, int pos)
{
numMap.insert(MyMap::value_type(num, pos));
}
好处是,如果您更改地图的类型,您可以减少以后更改的代码。如果std::map
的实施将value_type
从std::pair
更改为其他内容(在stl
的未来版本中),则不太可能但仍然可能,您是不可能的对那种变化。