如何对C++;使用std::greater映射键? 我在C++中创建了一个 /Cord>,我宁愿让它们从最高到最低排序,而不是默认排序顺序。我的研究让我找到了一个看起来很有希望的方法,但在尝试使用它时,我发现了一个编译错误:
一元“*”的类型参数无效(具有“int”) 我的地图声明是:如何对C++;使用std::greater映射键? 我在C++中创建了一个 /Cord>,我宁愿让它们从最高到最低排序,而不是默认排序顺序。我的研究让我找到了一个看起来很有希望的方法,但在尝试使用它时,我发现了一个编译错误:,c++,C++,一元“*”的类型参数无效(具有“int”) 我的地图声明是: std::map<int, int, std::greater<int> > numMap; 类似问题的答案,如在声明中包含括号,即std::greater()-但是当我包含这些参数时,我会得到关于函数返回函数的多个错误。问题-调用带有无效参数的std::map::insert成员函数:提供了两个整数值;但是必须有std::pair。请参阅参考资料: 更好的选择 为了方便(只是不要重复贴图类型参数),为贴图创
std::map<int, int, std::greater<int> > numMap;
类似问题的答案,如在声明中包含括号,即std::greater()-但是当我包含这些参数时,我会得到关于函数返回函数的多个错误。问题-调用带有无效参数的
std::map::insert
成员函数:提供了两个整数值;但是必须有std::pair
。请参阅参考资料:
更好的选择
为了方便(只是不要重复贴图类型参数),为贴图创建typedef
:
typedef std::map<int, int> IntMap;
选择:
std::make_pair()
函数:
void Row::addNumber(int num, int pos) {
numMap.insert(num, pos);
}
#include <utility>
...
void Row::addNumber(int num, int pos)
{
numMap.insert(std::make_pair(num, pos));
}
比Sergey的答案更迂腐一点(这也确实有效),改用:
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));
}
typedef std::map MyMap;
MyMap-numMap;
无效行::addNumber(int num,int pos)
{
insert(MyMap::value_type(num,pos));
}
这样做的好处是,如果更改映射的类型,以后要更改的代码就更少了。如果
std::map
的实现将其值类型
从std::pair
更改为其他类型(在stl
的未来版本中),则可能性要小得多,但仍然是可能的。当您反向阅读地图时,您的问题难道没有得到解决吗?只是说。你是说当你使用std::map
的默认比较器时,你不会得到同样的错误吗?因为在这种情况下这一点都不重要,非常重要。insert函数的工作方式与您预期的不同:(啊,谢谢,我假设C++的map insert的功能与Java的map.put相同——显然我应该对此进行更多的研究:——(@Exupery,顺便说一下,如果您在Java中使用了HashMap
class,您可能会想使用std::unordered_map
class(从C++11开始提供)–散列映射容器。谢谢,很高兴知道如何在将来使用,不过在这个特定的实例中,我确实需要订购映射。+1,是的,你是对的:std::map::value_type
非常方便(不要重复std::map
type的参数)。
void Row::addNumber(int num, int pos)
{
numMap.insert(std::pair<int, int>(num, pos));
}
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));
}