3

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

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

4

1 回答 1

4

这里的问题是您要在地图中添加一个值,然后立即更改它。如果您扩展代码,您实际上是在执行以下操作

iss >> field;
mymap[&field[0]] = 0;
iss >> field;  // Error!
mymap[&field[0]] = 0;

带标签的行是一个问题,因为 的成员field被存储为 中的键mymap。第三行将发生变异field,这意味着其中的键mymap也发生了变异。这种行为是不允许的,映射类型假定它们的键是不可变的。对它们进行变异使得以后无法可靠地检索这些值

看起来您想要做的是将字符串与int地图中的 an 相关联。如果是这样,那么只需std::string用作密钥。

map<std::string, int, ltstr> mymap;
...
while (iss>>field) {
  mymap[field] = 0;
}

这将std::string在地图中为每一行放置一个独立的副本。因此突变不会影响地图中的键。

注意:您可能必须更改 ltstr 以const std::string&作为输入而不是const char*同时进行此工作

另请注意,当您要将 an 转换为时std::stringconst char*请不要使用&field[0],而是使用标准方法field.c_str()

于 2013-07-30T00:06:03.920 回答