0

说我有地图

map<string, string> m;

并做一个

string x = m["asdf"];

不知道“asdf”是否在地图中。然后我将无法通过查看来可靠地确定它是否在地图中x。那是对的吗?

所以我应该m.first(asdf)首先弄清楚这一点。

4

4 回答 4

2

然后我将无法通过查看 x 来可靠地确定它是否在地图中。那是对的吗?

你说的对。如果它丢失,它将被默认构造。

您应该使用m.count("asdf")(只是找出它是否存在)或m.find("asdf")(加上,如果它存在则获取参考)来找出它是否存在。根据您的要求。

于 2012-07-13T07:09:45.227 回答
2

如果不存在,则使用默认值在地图中map::operator[]插入键。

如果您不希望这样:

std::map<string, string>::iterator it = m.find("asdf");
//if you use C++11:
//auto it = m.find("asdf");
if (it == m.end())
    std::cout << "Not found" << std::endl;
else
    std::cout << "The value is " << *it << std::endl;

map::operator[]对很多事情都很有用,尤其是在引用方面。例如:

std::string &x = m["asdf"];
x += "X";

这将"X"在地图中的(可能是新创建的)字符串中添加一个。

于 2012-07-13T07:09:48.333 回答
1

x 将是默认构造的 std::string。编译 operator[] 时,std::map 需要默认构造函数。

于 2012-07-13T07:08:37.793 回答
0

首先,如果使用值初始化而不是默认构造函数缺少一个,则 operator[] 将构造“值”对象。这意味着在适当的情况下使用默认构造函数,并为内置类型情况(整数、浮点数、指针)使用零初始化,以及为聚合(如简单结构)使用递归值初始化。

你是对的,如果你从 operator[] 获得一个值构造的对象,你将不知道它是否在地图中,或者它是否是动态生成的。operator[] 的另一个问题是它不是 const 成员。

尽管如此,操作符有时还是有用的。例如,如果我使用地图来存储某些文本的字数,

unsigned countCats( std::map<std::string, unsigned> dict )
{
  unsigned count = disc["cat"];
}

操作员的工作方式完全符合您的预期。

于 2012-07-13T07:30:55.167 回答