2013-07-24 2 views
-1

Я пишу парсер, и я решил сохранить информацию о типе на std :: map. Когда я использую оператор [] для доступа к нему, я всегда получаю значение 0 для перечисления. Карта объявляется как таковой:std :: map <std :: string, enum> не сохраняет значения

enum type {Bool, Bool_a, Int_4, Inta_4, Int_8, Inta_8, Float_s, Floata_s, Float_d, Floata_d, Ch_s, Ch_a, Str, Invalid}; 

class kparse_ret{ 
... 
    std::map<std::string, type 
... 
} ret_data; 

И затем устанавливается, используя нечто вроде

ret_data.type_list[itemname] = Int_4; 

(Где ItemName является зЬй :: строка)
Проблема у меня в том, что, когда я использование

ret_data.type_list[data_name] 

Я всегда получаю Bool или 0. (опять же, data_name является std :: string). Я знаю, что имя элемента и имя_данных имеют точно такое же содержимое, когда их соответствующие контексты будут достигнуты. Кроме того, если я снова использую itemname для доступа к нему, я получаю значение, которое я только что установил.

+4

Небольшой программу экспонирования проблемы требуется, в противном случае она будет спекулятивными догадкам (это 'map' случайным скопировано где и обновления применяются к копии из' map'? К примеру). – hmjd

+3

Вы сделали побайтовое сравнение между двумя строками? Они не отличаются капитализацией или встроенными/ведущими/конечными пробелами? Если вы выполняете сравнение между строкой (например, '==' operator), то они одинаковы? –

+0

[работает для меня] (http://coliru.stacked-crooked.com/view?id=0aaa158e47df5560c6b85a7eef786478-ce6b7b81d29c30e32c78aebe6e642254) – TemplateRex

ответ

0

При сравнении строки как клавиши для карты сравнивается не только содержимое строки, но также и размер строки.

Следующая поможет определить проблему:

std::map<std::string, std::string> 

std::string key = "KEY"; 
std::string key2 = "KEY"; 

key2.resize(100); 

теперь, если вы что-то отображается на «KEY» и использовать key2, чтобы получить доступ к нему, вы не получите значение Yous ожидаемого.

яв

+0

Это может быть проблемой, эти строки прошли много обработки. Влияет ли substr() на размер? –

+0

Абсолютно. В вашем случае вы можете захотеть сохранить ключи, которые хотите использовать для доступа к карте, и по сравнению с вычисленной подстрокой вы должны использовать соответствующий статический ключ, который вы сохранили ранее. – jav974

+0

На самом деле для этой карты. Я пытаюсь сопоставить имена переменных с их типами, и я не могу заранее предсказать, какими они могут быть. Было бы слишком ужасно хак-иш использовать что-то вроде 'keystring.resize (keystring.length())'? –

Смежные вопросы