2

在 C++ 中,如何根据三个键聚合结构的值?

在 Perl 中,我会使用哈希值(例如 $hash{$key1}{$key2}{$key3}{'call_duration'} += 25);

由于我是 C++ 的新手,您能否建议一种合适的方法?

我已经查看了关于 SO 在 C++ 中使用 std::map 讨论嵌套哈希等效项的主题,但是它指出这在性能方面很慢,并且由于我需要为电信运营商处理记录,因此性能至关重要。

我没有必要遵循使用模板库或在语法和思维方式上应该类似于 Perl 的任何方法,但是如果您必须做类似的事情,您能否分享一种快速且合适的方法来实现它?

我主要限于 C++ 98 标准(技术负责人允许使用更新的功能,只要它们得到编译器的支持并且它们具有关键优势)。

抱歉,如果描述混乱,并提前感谢!

编辑:编译器版本是 GCC 4.1.2,将 tr1/functional 作为库导入并不被它所反对。

编辑:非常感谢所有加入的人,特别是 Bartek 和 Rost 忍受了我的愚蠢问题。我决定选择 Rost 的答案,因为这是我真正能够开始工作的!:)

4

2 回答 2

2

简单的解决方案是使用 struct 聚合 3 个键,并将其用作键。

struct Key
{
    Type1 Key1;
    Type2 Key2;
    Type3 Key3;

    // I forgot about the comparator - you have to provide it explicitly
};

因为您对语言有些限制,请检查您的编译器是否支持std::hash_map

std::hash_map<Key, TValue> Data;

如果没有,您可以随时使用boost::unordered_map.

如果其他人偶然发现了同样的问题,那么“正确的解决方案”是这样的:

std::unordered_map<std::tuple<Type1, Type2, Type3>, TValue>;

编辑:示例用法

struct Key
{
    int Int;
    float Float;
    string String;
    // add ctor and operator<
};

std::hash_map<Key, int> Data;

Data[Key(5, 3.5f, "x")] = 10;
于 2012-09-26T09:22:20.190 回答
2

普通std::map的应该是合适的,它的性能在大多数情况下通常是没有问题的。哈希提供对元素的恒定时间访问,基于树的映射提供对数时间,但实际上恒定时间可能大于对数 - 它取决于具体实现和具体数据。如果您填充容器一次,然后只更新数据而不更改/插入/删除键,您可以使用 sortedstd::vectorLoki::AssocVector.

您应首先尝试std::map(或者std::set如果密钥实际上是数据的一部分),然后才能决定它对您来说是否太慢。例子:

// Composite key definition
struct CompositeKey
{
   int key1;
   std::string key2;
   AnotherType key3;

   CompositeKey(int i_key1, const std::string& i_key2, AnotherType i_key3):
      key1(i_key1), key2(i_key2), key3(i_key3)
   {}

   bool operator < (const CompositeKey& i_rhs) const
   {
      // You must define your own less operator for ordering keys
   }
};

// Usage
std::map<CompositeKey, Data> aggrData;

aggrData[CompositeKey(0, "KeyString", AnotherType())] = Data();

if(aggrData.find(CompositeKey(0, "KeyString", AnotherType())) != aggrData.end())
{
   // Process found data
}

对于进一步的性能研究,您可以尝试:

所有这些容器都具有相似的接口,因此封装起来并不困难,如果需要,也可以轻松切换实现。

于 2012-09-26T09:54:35.820 回答