我有这样的地图:
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
中获取任何数据。
所以,我的问题是:
如何正确访问该元素?
答案 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项内联温度)
希望有所帮助! :)