我正在尝试在VS2015中编译以下代码。我的std :: map的第一个版本正在编译,但秒版本没有编译。请让我知道我在这里做错了什么..
std::map<int, std::string> _p;
typedef std::pair<int, std::string> _q;
_p.insert(_q(0, "Football0"));
_p.insert(_q(1, "Football1"));
std::string str = _p[1]; //OK...compiles and executes, no error, str = "Football1" as expected
std::map<int, DataDictionary> _p1;
typedef std::pair<int, DataDictionary> _q1;
DataDictionary dd1;
dd1.i = 0;
dd1.version = "ver1";
_p1.insert(_q1(0, dd1));
DataDictionary dd2;
dd2.i = 0;
dd2.version = "ver2";
_p1.insert(_q1(1, dd2));
DataDictionary DD = _p1.find[1]; //error C3867: 'std::_Tree<std::_Tmap_traits<_Kty,_Ty,_Pr,_Alloc,false>>::find': non-standard syntax; use '&' to create a pointer to member
即使我决定更改我的std :: map并使用以下内容,我也会遇到同样的错误:
std::map<std::string, DataDictionary> _p1;
DataDictionary DD = _p1.find["1"]; //ERROR
我正在尝试使用带有DataDictionary结构的map,并使用_p1.find["1"]
语法来访问元素,因为我假设这种方法比向地图声明迭代器更快,然后使用find() 。请帮忙。谢谢,
答案 0 :(得分:2)
我正在尝试使用带有DataDictionary结构的map,并使用
_p1.find["1"]
语法来访问元素
不,您正尝试在成员函数上使用下标运算符:
find("1")
可行。
find["1"]
不应该编译。
考虑使用_p1.find("1")
或_p1["1"]
。它们之间的区别在于find返回一对地图中的位置和一个布尔标志一个迭代器(可能超过映射序列的末尾)和下标运算符({{1返回对现有元素的引用,或者添加一个元素(如果找不到),并返回对该元素的引用。
要检查地图是否包含密钥,请改用["1"]
。
答案 1 :(得分:0)
我认为你的意思是
_p1.find("1");
它返回找到项目的迭代器。
使用
std::map<std::string, DataDictionary>::iterator item = _p1.find("1");
或
在C ++ 11中你可以做到
auto item = _p1.find("1");