【发布时间】:2017-04-01 01:11:47
【问题描述】:
我正在尝试解决this problem。我想出了这个解决方案:
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)
我从 this SO question 和 subsequent answer 获得灵感来做到这一点:
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;
}
};
这也不会编译。我在StockTicker::addOrUpdate() 和StockTicker::top() 方法中得到了这个kind of error:
error: '((StockTicker*)this)->StockTicker::stocksTicker' does not have class type.
我也尝试了很多其他的东西(比如在StockTicker 类本身中声明一个公共比较器方法并尝试将它的函数指针传递给std::map。这也失败了;StockTicker::stocksTicker 之前被声明过比较器方法会,编译器会抱怨)。
关于如何解决此问题的任何想法?
【问题讨论】:
标签: c++ c++11 overloading stdmap custom-compare