我对c ++上的std :: map有一个不确定性:
我做了一个加载链接库(.so)C_Configuration
的对象C_ConfigurationLibrary
。
C_Configuration
班级有std::map
,The C_ConfigurationLibrary
有一个初始化std::map
的方法。
如果我使用“for”循环从std::map
访问C_Configuration
:
std::map<const char*, const char*>::iterator l_item;
for(l_item = m_configuration_map.begin();
l_item != m_configuration.end();
l_item++)
这没关系;
但如果我使用:
m_configuration[VALUE_KEY] // the value is NULL
这不行;
我的代码:
C_Configuration::C_Configuration()
{
m_configuration = LoadLibrary(); // load the linked library (.so)
if(m_configuration != NULL)
{
// DEBUG
LOG_DEBUG("Loading Key from plugin...");
m_configuration->LoadKeys(m_configuration_map);
std::map <const char*, const char*>::iterator l_item;
for ( l_item = l_configuration_map.begin();
l_item != l_configuration_map.end();
l_item++ )
{
//THIS IS OK
}
m_configuration_map[FIRST_KEY] // THIS IS NOT OK
}
}
void C_ConfigLibrary::LoadKeys(std::map<const char*, const char*>& p_configuration_map)
{
// DEBUG
LOG_DEBUG("Loading Keys...");
p_configuration_map.insert ( std::make_pair<const char*, const char*>(FIRST_KEY, FIRST_VALUE) );
// DEBUG
LOG_DEBUG("Loaded Key DBUS used: %s",m_dbus_used.c_str());
p_configuration_map.insert ( std::make_pair<const char*, const char*>(SECOND_KEY,SECOND_VALUE) );
}
你能帮帮我吗?
非常感谢
答案 0 :(得分:4)
您使用const char*
作为键,但指针会在其内存地址上进行比较,而不是它们指向的文本。因此,当您在共享库中有一个字符串文字,并且主应用程序对象中的字符串文字中有相同的文本时,它们可以具有不同的地址,并且不会比较等于键。
使用std::string
作为密钥会更好,尽管使用const char*
作为值是安全的。
FWIW,如果你使用const char*
作为关键词,不仅来自不同翻译单位的字符串文字有时会像这样挑剔,但你很难使用本地缓冲区中的文本,甚至std::string
' s .c_str()
返回值 - 这只是一个非常糟糕的主意。
答案 1 :(得分:1)
FIRST_KEY
是否确实存在,或者您只是将其用作示例来表明您希望该元素位于该给定键?
由于您将C字符串存储为std::map
的键,因此它无法正常工作。它们通过各自的地址进行比较,而不是字符串的实际内容,这可能是它失败的原因。您应该使用std::string
作为地图的关键字。
你应该发布实际代码,否则你只能期望猜测工作。显而易见,这段代码并不是全部,因为你使用FIRST_KEY
等,而我们不知道它们是什么,并且你的括号数量不匹配,以及会产生不完整的陈述错误。