我在初始化地图时遇到问题。目标是使用包含所有键的字符串.e.g“key1 key2 key3”在地图中创建条目
map<const char *, int, ltstr > mymap;
string fortest="a b c";
istringstream iss(fortest);
string field;
//cout<<"transaction name:"<<transactionName<<'\n';
//cout<<"transaction fields:"<<'\n';
while(iss>>field)
{
mymap[&field[0]]=0;
cout<<"field name:"<<field<<'\n';
cout<<mymap.size()<<'\n';
}
但这不起作用。我不确定是什么问题
答案 0 :(得分:4)
这里的问题是你是在地图中添加一个值然后立即更改它。如果您扩展代码,则基本上执行以下操作
iss >> field;
mymap[&field[0]] = 0;
iss >> field; // Error!
mymap[&field[0]] = 0;
标记的行是个问题,因为field
的成员被存储为mymap
内的键。第3行将改变field
,这意味着mymap
中的键也会发生变异。不允许这种类型的行为,地图类型假定它们的键是不可变的。对它们进行变异使得以后无法可靠地检索值
看起来您想要做的是将字符串与地图中的int
相关联。如果是,那么只需使用std::string
作为密钥。
map<std::string, int, ltstr> mymap;
...
while (iss>>field) {
mymap[field] = 0;
}
这将在地图中为每一行添加std::string
的独立副本。因此,突变不会影响地图中的键。
注意:您可能需要更改ltstr以const std::string&
作为输入,而不是const char*
来制作此工作
另请注意,当您要将std::string
转换为const char*
时,请勿使用&field[0]
,而应使用标准方法field.c_str()
。