引用作为 std::map 中的键

新手上路,请多包涵

假设一些数据结构:

 typedef struct {
    std::string s;
    int i;
} data;

如果我在 --- 类型的地图中添加 std::map<std::string&, data> data 的实例时使用字段 data.s 作为键,是否复制了字符串?删除地图元素是否安全,因为引用将变得无效?

这些问题的答案是否也适用于 unordered_map

编辑:

这是我目前的解决方案……但是向地图添加迭代器是丑陋的:

 typedef struct {
    const std::string* s;
    int i;
} data;

std::map<std::string, data> map;
typedef std::map<std::string, data>::iterator iterator;

// add an element to the map
iterator add_element(const std::string& s) {
    std::pair<iterator, bool> p = states.insert(std::make_pair(s, data()));
    iterator i = p.first;
    if(p.second) {
        data& d = (*i).second;
        d.s = &(*i).first;
    }
    return i;
}

原文由 Giovanni Funchal 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

C++11

由于 C++11 参考包装器 是标准的一部分。

 #include <functional>

std::map<std::reference_wrapper<std::string>, data>

使用升压

您可能想看看 boost.ref 。它提供了一个包装器,允许在 STL 容器中使用引用,如下所示:

 std::map<boost::reference_wrapper<std::string>, data>

原文由 Björn Pollex 发布,翻译遵循 CC BY-SA 4.0 许可协议

您不能将引用存储在标准库容器中 - 您的地图应如下所示:

 map <string,data> mymap;

该映射将为您管理密钥字符串和结构实例,它们将是副本。 mapunordered_map 在这方面的工作方式相同,所有其他标准库容器也是如此。

请注意,在 C++ 中,您不需要 typedef 来声明结构:

 struct data {
    std::string s;
    int i;
};

原文由 anon 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题