我需要获取 std::map
中的最小元素。我知道有很多可用的文档;但是,我似乎无法工作。
我有两个 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
)。
非常感谢您。
最佳答案
迭代 map 并始终分配相同的变量似乎是不必要的艰苦工作。
如果您需要访问 map 中的第一个项目(或 map 中的最后一个项目),那么 begin()(或 rbegin())就是您所需要的。
std::map <int, int> themap;
themap[4] = 1;
themap[2] = 2;
themap[1] = 3;
themap[6] = 4;
themap[5] = 5;
themap[7] = 6;
if (!themap.empty())
{
std::cout << "item[" << themap.begin()->first << "] = " << themap.begin()->second << std::endl;
std::cout << "item[" << themap.rbegin()->first << "] = " << themap.rbegin()->second << std::endl;
}
你唯一需要小心 begin 和 rbegin 的时候是当你的 map 是空的时候
关于c++ - 获取 std::map 中的最小键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24841118/