初始化for循环内的映射

时间:2013-07-30 00:02:40

标签: c++

我在初始化地图时遇到问题。目标是使用包含所有键的字符串.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';
}

但这不起作用。我不确定是什么问题

1 个答案:

答案 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()