如何访问以下地图中的元素:
map<int, string[4]> * my_map;
我曾经通过at()运算符
来做到这一点string * val_ptr = my_map->at(key);
最近,我发现这是我的编译器的非标准功能,正确的方法是通过operator[]
。不幸的是,编译器一直试图将我的密钥转换为string [4]
:
string * val_ptr = my_map->operator[](key);
error: conversion from ‘int’ to non-scalar type ‘std::string [4]’ requested
我已经在线查看,但似乎没有任何带有字符串数组映射的示例。我做的事情无效吗?我应该使用向量吗,如果是这样,创建和访问会更慢吗?
答案 0 :(得分:2)
使用.at()
功能不非标准功能。它在标准C + 11中(见doc)。
现在,这个,
string * val_ptr = my_map->operator[](key);
这是正确的,但应该写成:
string * val_ptr = (*my_map)[key];
因为它更简洁。
至于编译器错误,它在其他地方。
事实上,我相信,问题来自某个地方,并且是由地图的指针声明引起的。为什么不将地图声明为:
map<int, string[4]> my_map; //no pointer
然后使用
string * val_ptr = my_map[key];
如果您使用std::vector
,则会更好:
std::map<int, std::vector<std::string> > my_map; //no pointer
然后使用
std::vector<std::string> & val = my_map[key];
答案 1 :(得分:2)
您可以使用std::map<int, std::array<std::string,4> >
(或让您自己的class fourstring_t
包含四个字符串)并使用std::map<int,fourstring_t>
,您也可以使用
string second = (my_map->at(key))[1];
检索字符串数组中的第二个字符串(等级1)。
并且at方法是标准的,正如Nawaz提醒的那样。
正如UncleBens提醒的那样,您需要fourstring_t
类型可分配。