【发布时间】:2026-01-08 15:50:01
【问题描述】:
我需要获取std::map 中的最小元素。我知道有很多可用的文档;但是,我似乎无法工作。
我有两个映射,bid 和 ask,它们都是 Book 类的属性。每个都是队列地图。这些队列中的每一个都包含Order 对象(具有各种属性,例如price、volume 等)。我有一个成员函数update,它获得了最佳买价、最佳卖价和点差:
void update(void)
{
unsigned long long highest_bid, lowest_ask = 0;
for (std::map<unsigned long long, queue<Order>>::iterator it = this->bid.begin(); it != this->bid.end(); ++it)
{
highest_bid = it->first;
}
// best ask code here
this->bestBid = highest_bid;
this->bestAsk = lowest_ask;
this->spread = labs(this->bestAsk - this->bestBid);
}
询问代码在哪里,我尝试了以下方法:
lowest_ask = this->ask.begin()->first;
这可以编译,但是当我调试它时会引发断言失败(我已经阅读了这里的其他问题,但似乎无法理解):
Expression: map/set iterator not dereferencable
我尝试过反向迭代:
for(std::map<unsigned long long, queue<Order>>::reverse_iterator rit = this->ask.rbegin(); rit != this->ask.rend(); ++rit)
{
lowest_ask = rit->first;
}
编译和调试都很好,但lowest_ask 始终为0,这是错误的。当我在调试器中单步执行它时,它不会停止,直到它达到零。
我尝试过交换迭代器:
for(std::map<unsigned long long, queue<Order>>::reverse_iterator rit = this->ask.rend(); rit != this->ask.rbegin(); ++rit)
{
lowest_ask = rit->first;
}
这编译正常,但再次抛出调试断言失败。
我可以继续我已经尝试过的内容,但是这个问题已经过于复杂了。我只是不明白为什么我不能像一开始那样做 (lowest_ask = this->ask.begin()->first)。
非常感谢您。
【问题讨论】:
-
我在这个循环中看不到任何意义 for (std::map
>::iterator it = this->bid.begin(); it != this->bid.end(); ++it) {highest_bid = it->first;你能解释一下这个循环的意义吗? -
您确定您的询问地图不为空吗?
-
从头开始
std::map<unsigned long long, queue<Order>>::iterator放入auto。这就是 C++11 的魅力。