【问题标题】:Accessing elements inside map<int,string[4]>访问 map<int,string[4]> 中的元素
【发布时间】:2011-12-11 14:41:31
【问题描述】:

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

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

我在网上看过,但似乎没有任何带有字符串数组映射的示例。我在做一些无效的事情吗?我应该改用向量吗?如果是,创建和访问会更慢吗?

【问题讨论】:

  • map&lt;int, string[4]&gt; 什么时候合法了? string[4] 或任何其他数组不可分配。

标签: c++ gcc stl map std


【解决方案1】:

.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]; 

【讨论】:

【解决方案2】:

您可以使用std::map&lt;int, std::array&lt;std::string,4&gt; &gt;(或拥有自己的包含四个字符串的class fourstring_t)并使用std::map&lt;int,fourstring_t&gt;,您也可以使用

 string second = (my_map->at(key))[1];

检索字符串数组中的第二个字符串(排名为 1)。

正如 Nawaz 提醒的那样,at 方法是标准的。

正如 UncleBens 所提醒的,您需要 fourstring_t 类型是可分配的。

【讨论】:

    猜你喜欢
    • 2021-12-18
    • 1970-01-01
    • 2021-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多