这是我的地图std::map<std::string,ProductInfo> mymap
这些是ProductInfo
里面的值:
bool isActive = false;
char name[80];
我已经能够使用::iterator
访问特定的键值对(std::string
-ProductInfo
),但我实际需要的是ProductInfo
内的name
属性
这也是ProductInfo在调试时的样子
假设你有一个地图:
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';
}
在容器上循环,如果不是明确需要,则不使用迭代器(或索引),而是使用基于范围的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;
}
也不要使用上面建议的[]索引操作符。但请使用at: https://en.cppreference.com/w/cpp/container/map/at。如果没有找到数据,[]操作符将插入数据,这通常会导致错误。at函数只在map
中存在时才会返回数据。使用operator[]
访问std::map
的键会得到映射类型这是相同的ProductInfo
在您的例子。这意味着您可以使用成员访问操作符访问数据成员name
,如下所示:
//-----------------------------vvvv---->use member access operator
std::cout << mymap["some key"].name;
如果您为ProductInfo
提供了getter,那么您可以如下所示使用该getter:
std::cout << mymap["some key"].get_name();
还请注意,如果键不在映射中,那么在使用operator[]
时将创建一个新的键值对并插入到映射中,因此不要忘记初始化ProductInfo
中的每个数据成员。
您想要访问映射中ProductInfo
对象的属性name
。你需要做的是your_map["the key"]->get_name()
,其中get_name()
是ProductInfo
中name
的getter。