访问 std::vector<std::map<int, unsigned char>> 网格的元素给出错误 "Expression must have a class type"

Accessing elements of std::vector<std::map<int, unsigned char>>grid gives error "Expression must have a class type"

我搜索了很远,但找不到答案。为什么我不能访问元素?它给了我错误:“表达式必须有一个 class 类型”。我不知道这是什么意思。有人可以给我一个解决方案吗?

#include <iostream>
#include <vector>
#include <map>
#include <utility>
#include <algorithm>
int main()
{
    std::vector<std::map<int, unsigned char>>grid =
    {
        {std::make_pair(1,'-'), std::make_pair(2,'-'), std::make_pair(3,'-') },
        {std::make_pair(4,'-'), std::make_pair(5,'-'), std::make_pair(6,'-') },
        {std::make_pair(7,'-'), std::make_pair(8,'-'), std::make_pair(9,'-') }
    };
//This doesn't work
    std::cout << grid.at(0).at(0).second
    
}

grid.at(0)会给你一个std::map<int, unsigned char>。从 cppreference 开始,在地图上调用 .at(key) 将为您提供与该键对应的值。

如果你完成了:

std::cout << grid.at(0).at(1);

您会在第一张地图中看到 (1, '-') 对中的“-”。

如果您想获得第一对,您应该使用 .begin():

std::cout << grid.at(0).begin()->second;

查看实际效果:https://ideone.com/YmLIvK

你的意思好像是

 std::cout << grid.at(0).at(1);

而不是

std::cout << grid.at(0).at(0).second;

相同
std::cout << grid.at( 0 ).begin()->second;

前提是具有键 1 的元素是所选地图中的第一个元素。

也就是说在成员函数的第二次调用中at你必须在映射中指定一个键。在这种情况下,该函数将 return 在您的情况下具有标量类型 unsigned char.

的相应值

成员函数at声明为

T& at(const key_type& x);
const T& at(const key_type& x) const;

对于给定的键,它 return 是相应的值。

在索引 0 处的地图中,向量初始化为

{std::make_pair(1,'-'), std::make_pair(2,'-'), std::make_pair(3,'-')

键是 123

所以你可以使用表达式

grid.at(0).at(1)
grid.at(0).at(2)
grid.at(0).at(3)