【发布时间】:2015-04-07 22:28:12
【问题描述】:
我正在尝试同时使用列表和 unordered_map 来存储同一组对象。我是 C++ 新手,所以仍然对迭代器感到满意。
假设我有以下测试代码:
class Test {
public:
int x;
int y;
int z;
Test (int, int, int);
}
Test t1 = Test(1,2,3);
Test t2 = Test(2,4,6);
Test t3 = Test(3,6,9);
std::list<Test> list;
std::unordered_map<int, Test> map;
list.push_back(t3);
list.push_back(t2);
list.push_back(t1);
map[101] = t1;
map[102] = t2;
map[103] = t3;
是否可以通过key查找对象,然后从对象的引用(或者从unordered_map生成器?)生成列表迭代器?
因此,如果我有密钥 102,我可以在恒定时间内查找 t2。然后我想相对于 t2 在列表中的位置迭代向前/向后/插入/删除。
我可以使用 find 来获取指向 t2 的 unordered_map 迭代器。不知道怎么生成从t2开始的列表迭代器(我只能在列表的开头或者结尾生成迭代器,然后遍历。)
如果有人指点我有关 STL 和迭代器的优秀教程,我将不胜感激。
谢谢!
三思而后行: 这是一种可接受的方法吗?我有很多对象,需要通过整数键有效地查找它们。我还需要保留它们的顺序(与这些整数键无关)并有效地插入/删除/遍历。
【问题讨论】:
-
list和map都存储类的instance,两者都不能存储同一个实例,只是副本。如果您希望列表和地图都存储完全相同的实例,则需要使用指针。
-
是的,这就是目的。因此,如果我使用映射查找对我的 Test 实例的引用,我如何才能找到该引用在列表中的哪个位置并获取上一个或下一个列表元素?我可以在恒定时间内从列表中删除此引用吗?
-
在 C 中,我会实现一个双向链表,然后有一个哈希映射指向这个双向链表的元素。什么是 C++ 等价物?
-
不,您不能在恒定时间内从列表中删除任意节点,除非您对列表中的节点有迭代器。
-
我明白了。听起来下面的解决方案是我正在寻找的。我很惊讶这不会更频繁地出现(通常是我解决问题的迹象)。为此,我需要存储指向迭代器的指针,以便在我更改移动列表中的数据时可以更新所有“记住”迭代器位置的结构。听起来手动实现/管理双向链表更可取?
标签: c++ list c++11 iterator unordered-map