我有一个Java程序,想将其转换为C++。因此,在Java代码中使用了Linkedhashmap
数据结构,我想将其转换为C++。在C++中是否有与LinkedHashmap
相当的数据类型?
我尝试使用std::unordered_map
,但它不会保持插入顺序。
我有一个Java程序,想将其转换为C++。因此,在Java代码中使用了Linkedhashmap
数据结构,我想将其转换为C++。在C++中是否有与LinkedHashmap
相当的数据类型?
我尝试使用std::unordered_map
,但它不会保持插入顺序。
C++没有提供一个集合模板,其行为类似于Java的LinkedHashMap<K,V>
,因此需要将顺序与映射分开维护。
这可以通过将数据保留在std::list<std::pair<K,V>>
中,并保持单独的std::unordered_map<K,std::list<std::pair<K,V>>::iterator>
映射以便通过键快速查找项目来实现:
std::prev(list.end())
。std::list<std::pair<K,V>>
。std::list<std::pair<K,V>>
进行排序,会发生什么? - Kok How TehLinkedHashMap
所做的。如果这是您需要支持的用例,则需要使用不同的数据结构。 - Sergey Kalinichenkostd::list::iterator<std::pair<K,V>>
,编译器会抱怨'list'不是一个类、命名空间或枚举。但如果我写std::list<std::pair<K,V>>::iterator
,编译器就不会抱怨,然而后者似乎不起作用... - Adeesh Lemonickousstd :: map ,其中键是项目引用,值是插入顺序,使用红黑树对键进行排序。请参阅:STL中是否有排序的容器
这是我的做法:
map<TKey, set<MyClass<K1,K2>, greater<MyClass<K1, K2>>>> _objects; // set ordered by timestamp. Does not guarantee uniqueness based on K1 and K2.
map<TKey, map<K2, typename set<MyClass<K1, K2>, greater<MyClass<K1, K2>>>::iterator>> _objectsMap; // Used to locate object in _objects
添加对象 id
:
if (_objectsMap[userId].find(id) == _objectsMap[userId].end())
_objectsMap[userId][id] = _objects[userId].emplace(userId, id).first;
要删除一个对象的 id
:
if (_objectsMap[userId].find(id) != _objectsMap[userId].end()) {
_objects[userId].erase(_objectsMap[userId][id]);
_objectsMap[userId].erase(id);
}
要从特定对象id
开始检索最近的size
个对象:
vector<K2> result;
if (_objectsMap[userId].find(id) != _objectsMap[userId].end() && _objectsMap[userId][id] != _objects[userId].begin()) {
set<MyClass<K2, K2>, greater<MyClass<K1, K2>>>::iterator start = _objects[userId].begin(), end = _objectsMap[userId][id];
size_t counts = distance(_objects[userId].begin(), _objectsMap[userId][id]);
if (counts > size)
advance(start, counts - size);
transform(start,
end,
back_inserter(result),
[](const MyClass<K1, K2>& obj) { return obj.ID(); });
}
return result;