如何访问c++映射的内部值



这是我的地图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()ProductInfoname的getter。

相关内容

  • 没有找到相关文章

最新更新