我需要获得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
)。
非常感谢你。
答案 0 :(得分:5)
你是否有可能用肘部刮伤耳朵&#34;?我的意思是说,遍历地图并始终分配相同的变量似乎是不必要的艰苦工作。
如果您需要访问地图中的第一个项目(或地图中的最后一项),则只需要开始()(或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就是你的地图是空的
答案 1 :(得分:1)
我认为您可能只需检查您的容器是否为空,以便begin()
和rbegin()
返回有意义的(已定义)。
试试这个:
void update(void)
{
if(bid.empty() || ask.empty())
return;
// best ask code here
this->bestBid = bid.rbegin()->first;
this->bestAsk = ask.begin()->first;
this->spread = labs(this->bestAsk - this->bestBid);
}
答案 2 :(得分:0)
这不是&#34;复杂&#34 ;;它只需要一些标准的调试措施
#include <map>
#include <iostream>
#include <algorithm>
#include <random>
#include <string>
#include <queue>
namespace mock {
using Order = std::string;
struct Book {
using key_type = unsigned long long;
using order_queue_type = std::queue<Order>;
using property_type = std::map<key_type, order_queue_type>;
property_type bids, asks;
void diagnose(const property_type& prop) {
for (auto it = prop.cbegin(); it != prop.cend(); ++it) {
std::clog << "\t" << it->first << '\n';
}
}
void diagnose() {
std::clog << "bids:" << '\n';
diagnose(bids);
std::clog << "asks:" << '\n';
diagnose(asks);
}
Book() {
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<key_type> ba_dist(0, 1000);
std::uniform_int_distribution<std::size_t> len_dist(0, 10);
auto prop_gen = [&] (property_type& prop) {
auto count = len_dist(gen);
for (std::size_t i = 0; i < count; ++i) {
auto val = ba_dist(gen);
auto pair = prop.emplace(val, order_queue_type());
if (!pair.second) {
std::clog << val << " already present" << '\n';
}
}
};
prop_gen(bids);
prop_gen(asks);
}
};
}
int main() {
mock::Book book;
book.diagnose();
}
使用您的初始化例程和Book
类型,而不是我Order
ctor中的生成器。