【问题标题】:initializing a map inside a for loop在 for 循环中初始化地图
【发布时间】:2013-07-30 00:02:39
【问题描述】:

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

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

【问题讨论】:

  • 为什么要使用指针作为键? std::map&lt;std::string, int&gt;.
  • 另外,你忘了解释“这不起作用”对你意味着什么......

标签: c++


【解决方案1】:

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

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&amp; 作为输入而不是 const char* 以使此工作正常进行

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

【讨论】:

  • 谢谢 Jared.. 我知道现在有什么问题了
  • ltstr 几乎可以肯定是strcmp 的包装,所以我们不再需要std::string 键。另外,std::string::cstr() 不存在。
猜你喜欢
  • 1970-01-01
  • 2012-01-02
  • 1970-01-01
  • 1970-01-01
  • 2011-04-02
  • 2013-09-03
  • 1970-01-01
  • 2021-10-21
相关资源
最近更新 更多