【问题标题】:Unordered container with multiple keys / values具有多个键/值的无序容器
【发布时间】:2016-09-27 08:07:27
【问题描述】:

我需要一个数据容器来收集基于一个或多个键的数字数据(例如由 intstd::string 构建的键)。

对于一个键,如果要收集多个值,我可以简单地使用unordered_map<std::string, int>unordered_map<std::string, List<int>>

如果有多个键呢?其他帖子建议我使用 std::make_pair<type1, type2> 作为键,但这仅适用于 2 个键并且看起来有点 hacky。

是否有任何易于使用的数据结构或库允许由多个变量构建的键和分配给它的多个值?这些值只能通过键访问(我不需要类似 boost::multi_index 的东西,它提供了几个访问值的接口)。此外,这些值不得在容器中排序,但需要快速访问,因为在数据处理期间会添加/递增值。

【问题讨论】:

  • 最终将std::tuple 用于多个键值?我不知道这是否可能。
  • 创建一个包含多个成员的结构并将其用作键只要所需的运算符重载就可以正常工作。
  • @GillBates 我认为除了相等运算符 std::hash 之外的无序集合也应该是专门的......
  • 愚蠢的问题(或不是):“复合键”中的“多个”,或“多个键中的任何一个指向一个数据”中的“多个”
  • @Patrick stackoverflow.com/a/17017281/1870760 向您展示您需要知道的一切,只需将两个成员与std::hash 结合起来即可。

标签: c++ c++11 containers


【解决方案1】:

你可以使用 std::tuple 来做同样的事情。元组比较适用于几乎所有内置类型的多个元素。例如

typedef tuple<int, int> tx;
tx t1 = make_tuple(1, 1);
tx t2 = make_tuple(1, 2);

if (t1 == t2) {
        cout << "EQUAL" << endl;
}

typedef tuple<string, string> tx;
    tx t1 = make_tuple("AB", "CD");
    tx t2 = make_tuple("AB", "CD");

    if (t1 == t2) {
        cout << "EQUAL" << endl;
    }

使用元组作为 unordered_map 中的键

使用地图的一个例子可以是

map<tx, int> mp;
mp[make_tuple("AB", "CD")] = 100;
mp[make_tuple("EF", "GH")] = 200;

要更新现有的密钥,我们可以使用

mp[t1] = 300;

【讨论】:

  • 我用 tuple<:string int> 试过了,它需要实现一个哈希函数。所以基本上需要与使用结构相同的努力?
  • 不,你不会,你可以这样写地图。
  • typedef 元组 tx; tx t1 = make_tuple("AB", "CD"); tx t2 = make_tuple("AB", "CD"); if (t1 == t2) { cout mp; mp[make_tuple("AB", "CD")] = 100; mp[make_tuple("EF", "GH")] = 200; mp[t1] = 300;
  • 感谢您的补充说明!我认为元组的优点是不必实现任何哈希和比较函数,但是如果使用很多参数,结构体更容易理解。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-17
  • 1970-01-01
  • 2017-02-16
  • 1970-01-01
相关资源
最近更新 更多