2013-03-27 3 views
2

У меня есть карта, как это: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.

Итак, мой вопрос:

Как правильно получить доступ к этому элементу?

+1

Вы знаете, что в C++ вам не нужна 'typedef struct ...'? Идентификатор фактической структуры действует как тип. –

+0

Вы действуете как 'if (condition) flag = true; if (flag) {... do stuff ...} 'Возможно, вы только что переместили этот блок, а не флаг, который вы знаете. –

ответ

4

Это связано с оператором приоритета:

ins_todate = *(iter).second.validToDate; 

использует разыменования оператор на iter.second.validToDate (The разыменовать (*) оператор имеет более низкий приоритет, чем при выборе элемента (.) оператора).

Вы должны сделать

ins_todate = (*iter).second.validToDate; 

или

ins_todate = iter->second.validToDate; 
+0

Что делает 'operator *' делать на 'std :: string'? Я не могу найти его в качестве участника: http://en.cppreference.com/w/cpp/string/basic_string –

+0

Хорошо, отлично, но можете ли вы посмотреть и на более ранний код. Думаете ли вы, что я делаю другие вещи правильно (кроме того, что вы уже упоминали в комментарии :)). Взгляни, пожалуйста. Спасибо – Chani

+1

@MarkRansom Ну, это не так? OP пытается разыменовать строку, когда он/она должен разыменовать итератор. –

1

не ответ, но некоторые предложения для кодирования стиль здесь:

I. Если вы пишете на C++, вы должны do:

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! 

(Вы можете ссылаться на Рефакторинг: Impriving конструкции существующий код, 2-е изд., п. 6.3 Inline Temp)

Надеюсь, что это поможет! :)