如何访问 C++ 映射内部值
How to access C++ map inner values
这是我的地图 std::map<std::string,ProductInfo> mymap
这些是 ProductInfo
:
中的值
bool isActive = false;
char name[80];
我已经能够使用 ::iterator
访问特定的键值对 (std::string
- ProductInfo
) 但我真正需要的是 name
属性 里面 ProductInfo
also this is what ProductInfo looks like during debug
假设你有一张地图:
std::map<KeyT, ValueT> m;
您的迭代器指向的值定义为:
using value_type = std::pair<KeyT const, ValueT>;
因此,您使用 pair::second
作为映射值:
auto it = m.find("some key");
if (it != m.end()) {
std::cout << "name: " << it->second.name << '\n';
}
您想访问地图中 ProductInfo
对象的 属性 name
。您需要做的是 your_map["the key"]->get_name()
,其中 get_name()
是 ProductInfo
中 name
的 getter。
使用 operator[]
访问 std::map
的键给我们 映射类型 与示例中的 ProductInfo
相同.这意味着您可以使用成员访问运算符访问数据成员 name
,如下所示:
//-----------------------------vvvv---->use member access operator
std::cout << mymap["some key"].name;
如果您为 ProductInfo
提供了 getters,那么您可以使用 getter,如下所示:
std::cout << mymap["some key"].get_name();
另请注意,如果键不在地图中,则在使用 operator[]
时将创建一个新的 key-value 对并将其插入地图中,因此不要忘记初始化每个ProductInfo
.
中的数据成员
要遍历容器,如果不是明确需要,则不要使用迭代器(或索引),而是使用基于范围的 for 循环 (https://en.cppreference.com/w/cpp/language/range-for)。基于范围的可读性更强,可以防止意外越界访问。
为了代码可读性,您可以像这样使用结构化绑定 (https://en.cppreference.com/w/cpp/language/structured_binding):
#include <iostream>
#include <map> // or unordered_map for faster access
#include <string>
struct ProductInfo
{
std::size_t id;
};
int main()
{
// initialize map with 3 entries
std::map<std::string, ProductInfo> m_products
{
{"one",{1}},
{"two",{2}},
{"three",{3}}
};
// range based for loop with structured bindings
for (const auto& [key, product_info] : m_products)
{
std::cout << "key = " << key << ", value = " << product_info.id << "\n";
}
return 0;
}
也不要按照上面的建议使用 [] 索引运算符。但是使用:https://en.cppreference.com/w/cpp/container/map/at。如果找不到数据,[] 运算符将插入数据,这通常会导致错误。如果 at 函数确实存在于 map
中,则它只会 return 数据
这是我的地图 std::map<std::string,ProductInfo> mymap
这些是 ProductInfo
:
bool isActive = false;
char name[80];
我已经能够使用 ::iterator
访问特定的键值对 (std::string
- ProductInfo
) 但我真正需要的是 name
属性 里面 ProductInfo
also this is what ProductInfo looks like during debug
假设你有一张地图:
std::map<KeyT, ValueT> m;
您的迭代器指向的值定义为:
using value_type = std::pair<KeyT const, ValueT>;
因此,您使用 pair::second
作为映射值:
auto it = m.find("some key");
if (it != m.end()) {
std::cout << "name: " << it->second.name << '\n';
}
您想访问地图中 ProductInfo
对象的 属性 name
。您需要做的是 your_map["the key"]->get_name()
,其中 get_name()
是 ProductInfo
中 name
的 getter。
使用 operator[]
访问 std::map
的键给我们 映射类型 与示例中的 ProductInfo
相同.这意味着您可以使用成员访问运算符访问数据成员 name
,如下所示:
//-----------------------------vvvv---->use member access operator
std::cout << mymap["some key"].name;
如果您为 ProductInfo
提供了 getters,那么您可以使用 getter,如下所示:
std::cout << mymap["some key"].get_name();
另请注意,如果键不在地图中,则在使用 operator[]
时将创建一个新的 key-value 对并将其插入地图中,因此不要忘记初始化每个ProductInfo
.
要遍历容器,如果不是明确需要,则不要使用迭代器(或索引),而是使用基于范围的 for 循环 (https://en.cppreference.com/w/cpp/language/range-for)。基于范围的可读性更强,可以防止意外越界访问。
为了代码可读性,您可以像这样使用结构化绑定 (https://en.cppreference.com/w/cpp/language/structured_binding):
#include <iostream>
#include <map> // or unordered_map for faster access
#include <string>
struct ProductInfo
{
std::size_t id;
};
int main()
{
// initialize map with 3 entries
std::map<std::string, ProductInfo> m_products
{
{"one",{1}},
{"two",{2}},
{"three",{3}}
};
// range based for loop with structured bindings
for (const auto& [key, product_info] : m_products)
{
std::cout << "key = " << key << ", value = " << product_info.id << "\n";
}
return 0;
}
也不要按照上面的建议使用 [] 索引运算符。但是使用:https://en.cppreference.com/w/cpp/container/map/at。如果找不到数据,[] 运算符将插入数据,这通常会导致错误。如果 at 函数确实存在于 map
中,则它只会 return 数据