【问题标题】:C++ map not inserting properlyC++ 地图没有正确插入
【发布时间】:2016-06-11 05:22:27
【问题描述】:

我正在尝试从以下结构填充地图:

struct CounterParty
{
    uint8_t firm_id;
    char trader_tag[3];
    uint32_t qty;
};
struct OrderFillMessage
{
    Header header;
    uint32_t order_id;
    uint64_t fill_price;
    uint32_t fill_qty;
    uint8_t no_of_contras;
    std::vector<CounterParty> CounterPartyGroup;
    char termination_string[8]; 
};

void TradeDecoder::findMostActiveTrader()
{
    map<char*,int> traders_volume_map;
    for(OrderFillMessage m: OrderFillMessages)
    {
        for(CounterParty cp: m.CounterPartyGroup)
        {
            outputfile<<cp.trader_tag<<" "<<cp.qty<<endl;
            traders_volume_map[cp.trader_tag]+=cp.qty;
        }
    }
    outputFileTrader<<"PRINTING MAP "<<traders_volume_map.size()<<"\n";
    for(auto it=traders_volume_map.begin(); it!=traders_volume_map.end(); it++)
    {
        outputFileTrader<<(it)->first<<(it)->second<<endl;
    }
}

如您所见,它只是一个简单的插入或更新地图功能。

outputfile<<cp.trader_tag<<" "<<cp.qty<<endl;

打印以下内容:

IYH 2
HTC 1
IYH 2
HTC 1
IYH 2
HTC 1
IYH 1
HTC 1
IYH 1
HTC 1
IYH 1
HTC 1
IYH 1
HTC 1
IYH 1

但是outputFileTrader&lt;&lt;"PRINTING MAP "&lt;&lt;traders_volume_map.size()&lt;&lt;"\n"; 打印:

PRINTING MAP 1
HTC3050

这意味着地图中没有添加任何内容,即使地图中只有 1 个元素,也找到了所有内容!?

任何关于为什么会发生这种情况的见解将不胜感激!

虽然我认为这不会导致地图查找问题,但我想补充一点,trader_tag 是一个非空终止的char[3]

【问题讨论】:

  • 为什么您的命名约定不一致?即 CounterPartyGroup 应该是 counter_party_group 。当您还使用单数时,也使用复数不是一个好主意
  • cp.trader_tag 可能在每次循环迭代时具有相同的值。您正在使用 局部变量的地址 作为映射键。 (导致未定义的行为)。为避免这种行为,请使用 std::string 作为键。
  • cp.trader_tag 没有相同的值,我在帖子中显示过。
  • 您没有打印指针,但值指针 trader_tag 指向。

标签: c++ dictionary std stdmap c++-standard-library


【解决方案1】:

您正在使用char * 作为密钥。这是一个坏主意,因为这会有很大差异。

使用下面的

map<std::string, int> traders_volume_map;

解决这个问题。

【讨论】:

  • 我无法更改为字符串,因为:trader_tag 是 char[3],并且它不是空终止的...如果我要空终止它,我需要执行 char[2]='\0 ',这将覆盖 trader_tag 中的最后一个字符
  • @weiizeng 可以改成std::stringstd::string x(trader_tag, 3); 请看文档如何构造字符串here,看构造函数4)
  • 你很幸运有outputfile&lt;&lt;cp.trader_tag&lt;&lt;" "&lt;&lt;cp.qty&lt;&lt;endl;
  • 我想我已经想到了一个变通办法...我将在我的结构中添加另一个字段,例如 char trader_tag_string[4],并在那里添加空字符...
  • @weiizeng traders_volume_map[std::string(cp.trader_tag,3)] += cp.qty; -- 这就是答案建议你做的事情。
猜你喜欢
  • 1970-01-01
  • 2021-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多