首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在C++中使用键聚合值?

如何在C++中使用键聚合值?
EN

Stack Overflow用户
提问于 2012-09-26 17:10:06
回答 2查看 1.1K关注 0票数 2

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

在Perl语言中,我会使用散列的散列(例如,类似于$hash{$key1}{$key2}{$key3}{'call_duration'} += 25);

因为我是C++的新手,你能推荐一个合适的方法吗?

我看过关于使用std::map在C++中讨论嵌套哈希等效物的主题,但它指出这在性能方面很慢,而且我需要为电信运营商处理记录,所以性能是至关重要的。

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

我主要局限于C++ 98标准(技术领导允许使用较新的特性,只要它们得到编译器的支持,并且它们具有关键的好处)。

如果描述混乱,我深表歉意,并提前表示感谢!

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-26 17:54:36

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

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

代码语言:javascript
复制
// 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
}

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

  • hash_map/hash_set (在GCC)
  • boost::unordered_map/boost::unordered_set
  • Loki::AssocVector
  • std::unordered_map/std::unordered_set only

中命名为stdex::hash_map,在MSVC++中命名为stdex::hash_map,在MSVC++- __gnu_cxx::hash_map中命名为__gnu_cxx::hash_map

所有这些容器都有类似的接口,因此封装它并不困难,如果需要的话,也可以很容易地切换实现。

票数 2
EN

Stack Overflow用户

发布于 2012-09-26 17:22:20

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

代码语言:javascript
复制
struct Key
{
    Type1 Key1;
    Type2 Key2;
    Type3 Key3;

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

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

代码语言:javascript
复制
std::hash_map<Key, TValue> Data;

如果不是这样,您可以始终使用boost::unordered_map

然而,如果其他人遇到同样的问题,“正确的解决方案”是:

代码语言:javascript
复制
std::unordered_map<std::tuple<Type1, Type2, Type3>, TValue>;

编辑:示例用法

代码语言:javascript
复制
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;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12598252

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档