访问map <int,string [4]> </int,string [4]>中的元素

时间:2011-12-11 14:41:32

标签: c++ gcc stl map std

如何访问以下地图中的元素:

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

我已经在线查看,但似乎没有任何带有字符串数组映射的示例。我做的事情无效吗?我应该使用向量吗,如果是这样,创建和访问会更慢吗?

2 个答案:

答案 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类型可分配。