STL:从已作为第二对添加到地图的结构中访问数据

时间:2013-03-27 15:34:40

标签: c++ stl

我有这样的地图:

typedef std::map<std::string, Copied_Instrument_Data> InternalIdWise_Copied_Instrument_Data;

其中,Copied_Instrument_Data是一个结构:

typedef struct 
{
    std::string type;
    std::string marketListId;
    std::string sectorCode;
    std::string validToDate;
    int notificationType;
    bool npgFlag;
}Copied_Instrument_Data;

我使用以下方法将数据插入地图

InternalIdwise_Copied_Instrument_Data__Map.insert( std::pair<std::string, Copied_Instrument_Data >(internalId, CID) );

其中CID是Copied_Instrument_Data结构变量。

后来我使用了:iter = InternalIdwise_Copied_Instrument_Data__Map.find("SomeKeyString");

宣布iter之后:InternalIdWise_Copied_Instrument_Data::iterator iter;

然后我有:

if (iter != InternalIdwise_Copied_Instrument_Data__Map.end() )
        Instrument_available = true;
if (Instrument_available == true)
{
        ins_todate = *(iter).second.validToDate;
       std::cout<<ins_todate; 
}

然而,这不起作用。我没有在ins_todate中获取任何数据。

所以,我的问题是:

如何正确访问该元素?

2 个答案:

答案 0 :(得分:4)

它与运算符优先级有关:

ins_todate = *(iter).second.validToDate;

使用iter.second.validToDate上的解除引用运算符(取消引用(*)运算符的优先级低于元素选择(.)运算符。

你应该做

ins_todate = (*iter).second.validToDate;

ins_todate = iter->second.validToDate;

答案 1 :(得分:1)

不是答案,而是对编码风格的一些建议:

予。 如果你正在编写C ++,你应该这样做:

struct Copied_Instrument_Data
{
    ...
};

而不是

typedef struct 
{
    ...
} Copied_Instrument_Data;

后者提供了一个未命名的struct,然后是typedef,这是不必要的,您不能在此struct上使用前向声明。

II。 您可以使用std::make_pair将元素插入地图中,我个人认为它更清晰,更容易:

Map.insert( std::make_pair(internalId, CID) );

III。 如果临时变量只是一个标志,即

,则应予以替换
if (iter != InternalIdwise_Copied_Instrument_Data__Map.end() )
        Instrument_available = true;
if (Instrument_available == true)
{
    ...
}

应该是

if (iter != InternalIdwise_Copied_Instrument_Data__Map.end())
{
    ...
}

或者,这可以通过回复来完成以排除错误条件:

if (iter == InternalIdwise_Copied_Instrument_Data__Map.end())
{
    // print some error log?
    return;
}

// continue your work!

(您可以参考重构:破坏现有代码的设计,第2版,第6.3项内联温度

希望有所帮助! :)