我正在尝试解决这个问题。我想出了这个解决方案:
typedef unordered_map<string, double> stockDictType;
class StockTicker {
class Comparator {
public:
inline bool operator() (const string &a, const string &b) const {
return stocksDict.at(a) < stocksDict.at(b);
}
};
stockDictType stocksDict;
map<string, stockDictType::iterator, Comparator> stocksTicker; // this is where I need a custom comparator method
int tickerSize;
public:
StockTicker(int k): tickerSize(k) {}
// some other methods
};
很明显,这无法编译:StockTicker::stocksDict
不是静态成员。现在我不能这样做,因为我可能需要StockTicker
该类的多个实例。
std::map
使用严格的比较器函数参数定义(std::map
只会传入要比较的键),所以我不能重载它来传递对当前StockTicker
类实例的引用(我可以用来StockTicker::stocksDict
通过 public访问吸气剂)
我从这个 SO question和随后的答案中获得了灵感:
typedef unordered_map<string, double> stockDictType;
class StockTicker {
class Comparator {
public:
stockDictType &_stockDictRef;
explicit Comparator(stockDictType &stocksDict): _stockDictRef(stocksDict) {}
inline bool operator() (const string &a, const string &b) const {
return _stockDictRef.at(a) < _stockDictRef.at(b);
}
};
stockDictType stocksDict;
map<string, stockDictType::iterator, Comparator> stocksTicker(Comparator{stocksDict});
int tickerSize;
public:
StockTicker(int k): tickerSize(k) {}
void addOrUpdate(string name, double price) {
stocksDict[name] = price;
stocksTicker.at(name) = stocksDict.find(name);
}
vector<stockDictType::iterator> top() {
vector<stockDictType::iterator> ret(tickerSize);
auto it = stocksTicker.begin();
for(int i = 0; i < tickerSize; i++, it++)
ret[i] = it->second;
return ret;
}
};
这也不会编译。我在and方法
中遇到这种错误: .StockTicker::addOrUpdate()
StockTicker::top()
error: '((StockTicker*)this)->StockTicker::stocksTicker' does not have class type
我也尝试了很多其他的东西(比如在StockTicker
类本身中声明一个公共比较器方法并尝试将它的函数指针传递给std::map
. 那也失败了;StockTicker::stocksTicker
在比较器方法之前声明并且编译器抱怨)。
关于如何解决这个问题的任何想法?