获取std :: map中的最小键

时间:2014-07-19 13:52:33

标签: c++ c++11 map lob

我需要获得std::map中的最小元素。我知道有很多文件可供使用;但是,我似乎无法工作。

我有两张地图bidask,这两张地图都是Book类的属性。每个都是队列的地图。这些队列中的每一个都包含Order个对象(具有pricevolume等各种属性)。我有一个成员函数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)。

非常感谢你。

3 个答案:

答案 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中的生成器。