如何访问 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()ProductInfoname 的 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 数据