说我有地图
map<string, string> m;
做一个
string x = m["asdf"];
不知道地图中是否有“asdf”。然后,通过查看x
,我将无法可靠地判断它是否在地图中。这是对的吗?
所以我应该先做m.first(asdf)
来解决这个问题。
答案 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"];
}
操作员完全按照您的预期工作。