我已经声明并填充了一个Map:std::map<std::string, std::vector<std::pair<std::string, std::vector<std::vector<float>>>>> data;
.
我有一个打印功能来打印Map的内容,如下所示:
void print() {
for (auto it : data) {
std::cout << it->first << "\n";
for (auto iter : it->second) {
std::cout << iter->first << "\n";
for (auto val : iter->second) {
std::cout << val->second << "";
}
std::cout << "\n";
}
std::cout << "\n";
}
}
但是,当我编译程序时,我得到了以下错误:
operator -> or ->* applied to "std::pair<const std::string,
std::vector<std::pair<std::string,
std::vector<std::vector<float,
std::allocator<float>>,
std::allocator<std::vector<float, std::allocator<float>>>>>,
std::allocator<std::pair<std::string,
std::vector<std::vector<float, std::allocator<float>>,
std::allocator<std::vector<float, std::allocator<float>>>>>>>>"
instead of to a pointer typeC/C++(3364)
我不知道我做错了什么。
我还尝试通过(*it).first
访问Map数据,这会引发以下错误:
no operator "*" matches these operandsC/C++(349)
myfile.cpp(80, 23): operand types are: * std::pair<const std::string,
std::vector<std::pair<std::string, std::vector<std::vector<float,
std::allocator<float>>, std::allocator<std::vector<float,
std::allocator<float>>>>>, std::allocator<std::pair<std::string,
std::vector<std::vector<float, std::allocator<float>>,
std::allocator<std::vector<float, std::allocator<float>>>>>>>>
我应该做什么而不是我已经做了什么?请让我知道,如果我错了代码的任何地方。
1条答案
按热度按时间plicqrtu1#
当你试图展开你的Map时,你犯了几个错误。你需要从外部结构到内部结构。
您需要理解,使用基于范围的for循环已经展开了一个级别。
为了学习它,您应该避免使用
auto
关键字,因为这样您 * 必须 * 命名正确的数据类型。所有上述情况将导致:
另外,用
using
语句定义自己的类型也会很有帮助。然后,你可以先从内到外构建你的数据结构。为了打印,你可以使用预定义的类型。这会让生活变得简单一点:
最后但并非最不重要的一点是,您可以对
std::map
和std::pair
使用结构化绑定,这一次还是使用auto
,但同样更具可读性:不幸的是,复杂的数据结构将使访问子元素有点困难。