Я пытаюсь решить эту проблему. Я придумал это решение:
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
через публичные геттеры)
Я черпал вдохновение из этот вопрос SO и последующий ответ для этого:
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()
: error: '((StockTicker*)this)->StockTicker::stocksTicker' does not have class type
.
Я также пробовал кучу других вещей (например, объявление общедоступного метода компаратора в самом классе StockTicker
и попытка передать указатель на его функцию в std::map
. Это также не удалось; StockTicker::stocksTicker
объявляется до того, как метод компаратора делает это, и компилятор жалуется) .
Любые идеи о том, как это исправить?