gpt4 book ai didi

c++ - 将自定义比较器重载到 std::map

转载 作者:行者123 更新时间:2023-11-28 01:50:41 25 4
gpt4 key购买 nike

我正在尝试解决 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 类的当前实例的引用(我可以使用它通过公共(public) getter 访问 StockTicker::stocksDict)

我的灵感来自 this SO questionsubsequent 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;
}
};

这也不会编译。我明白了 kind of errorStockTicker::addOrUpdate()StockTicker::top() 方法中:错误:'((StockTicker*)this)->StockTicker::stocksTicker' 没有类类型

我也尝试了很多其他的东西(比如在 StockTicker 类本身中声明一个公共(public)比较器方法,并试图将它的函数指针传递给 std::map。这也失败了;StockTicker::stocksTicker 在比较器方法执行之前被声明,编译器提示)。

关于如何解决这个问题有什么想法吗?

最佳答案

 std::map<std::string, stockDictType::iterator, Comparator> stocksTicker(Comparator(stocksDict));

这定义了一个名为 stocksTicker 的成员函数这需要 stocksDict Comparator 类型的参数并返回 std::map .

std::map<std::string, stockDictType::iterator, Comparator> stocksTicker{Comparator{stocksDict}};

这里定义了一个成员变量stocksTicker默认情况下,它是用 Comparator 初始化的, 又用成员变量 stocksDict 初始化.

我假设你想要第二个。

您的语法介于两者之间。无论您对此感到困惑的编译器是什么。

Live example

你应该StockTicker(StockTicker &&)=deleteStockTicker& operator=(StockTicker &&)=delete ,因为包含对其包含类的引用的映射移动或复制是不安全的。

在这里生成有效的移动是很棘手的。我怀疑 C++17 节点拼接可能使它成为可能。您可能必须嵌入 std::shared_ptr<stocksDict*> (是的,指向指针的共享指针),并使用 .key_comp重新安装 stocksDict在目标中。

关于c++ - 将自定义比较器重载到 std::map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43144816/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com