语句“x = map [keyPotentiallyNotYetInMap]”对什么有用吗?

时间:2012-07-13 07:04:42

标签: c++ stl map

说我有地图

map<string, string> m;

做一个

string x = m["asdf"];

不知道地图中是否有“asdf”。然后,通过查看x,我将无法可靠地判断它是否在地图中。这是对的吗?

所以我应该先做m.first(asdf)来解决这个问题。

4 个答案:

答案 0 :(得分:2)

  

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

你是对的。它将被默认构建,以防它丢失。

您应该使用m.count("asdf")(只是查明它是否存在)或m.find("asdf")(加上,如果存在,请获取参考)以确定它是否存在。根据您的要求。

答案 1 :(得分: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"

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

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

尽管如此,运营商有时也很有用。例如,如果我使用地图来存储某些文字的字数,

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

操作员完全按照您的预期工作。