在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的答案,因为这是我真正能够做到的!:)
发布于 2012-09-26 17:54:36
一般的std::map应该是合适的,它的性能在大多数情况下通常不是问题。Hash提供对元素的恒定时间访问,基于树的映射提供对数时间,但在现实中,恒定时间可能大于对数-这取决于特定的实现和特定的数据。如果您填充容器一次,然后只更新数据而不更改/插入/删除键,则可以使用排序的std::vector或Loki::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
}对于进一步的性能研究,您可以尝试:
hash_map/hash_set (在GCC)boost::unordered_map/boost::unordered_setLoki::AssocVectorstd::unordered_map/std::unordered_set only中命名为stdex::hash_map,在MSVC++中命名为stdex::hash_map,在MSVC++- __gnu_cxx::hash_map中命名为__gnu_cxx::hash_map
所有这些容器都有类似的接口,因此封装它并不困难,如果需要的话,也可以很容易地切换实现。
发布于 2012-09-26 17:22:20
简单的解决方案是使用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;https://stackoverflow.com/questions/12598252
复制相似问题