我正在扩展已有的C ++代码。 其中一个类成员是另一个类对象的vector类型:
class Road
{
....
vector<Link*> links; //Link is just another class
}
其他模块通过大量的序列迭代器使用此类及其成员。 现在,在扩展代码时,我需要将一个成员添加到名为linkID的Link类,并使用此linkID来查找/访问我的“链接”对象。
问题: 我不会通过遍历数百万个项目来搜索向量中的Link对象(使用LinkID),只是为了找到特定的Link对象。最好的解决方案是“地图”!正确?
....
map<linkID,*link> links
....
lnk=links[linkID]
.........
但问题是我无法修改当前的源代码,只需添加linkID等非常小的修改。
所以我明显的问题是: 是否可以使用地图代替矢量(任何方式)。 换句话说,我想创建一个地图,填充它,然后将其视为矢量。可能? 感谢您的评论
答案 0 :(得分:0)
最好的解决方案是“地图”!正确?
是的,听起来地图是解决问题的最简单方法。但是我没有使用operator [],而是使用find和insert方法。
最初,您可以更改代码以使用此类型的地图std::map< unsigned int, link* >
,因为这与vector< link* >
最相似。然后,您可以轻松切换到std::map< LinkId, link* >
。
答案 1 :(得分:0)
将地图伪装为矢量是不可能的。
理论上,您可以尝试从vector实现派生的新类(即使用std::vector
作为基类)。在内部它可以使用一个映射,并且在外部它将具有一个向量的接口(并且它将被接受作为向量的替代,因为它是从它派生的)。
但实际上,您可能会遇到许多问题。您显然也会继承向量的内部数据结构,因此您必须在实现中忽略它们,即将它们留空。正如@Als在下面的评论中指出的那样,从STL类派生(basic_
除外)也违反了推荐的做法并且可能存在风险。
如果有可能通过重写现有代码的大部分来避免这种情况,那么你应该这样做。但如果不可避免,使用继承可能会有效。
答案 2 :(得分:0)
我认为您可以做的是创建一个增强的数据结构:vectormap
,它允许您通过linkID
对项目进行键控访问,并且还支持{std::vector
的操作1}}。可以重载此对象的[]
运算符,以便links[3]
为您提供对向量的位置访问权限,links[linkID]
在地图中查找链接ID。如果代码需要,可以支持push_back
之类的内容:push_back
必须将元素推送到向量中,然后执行map[item->linkID] = item
将其输入到地图中。你可能会得到这张照片。
答案 3 :(得分:0)
我在很多个月前为铁路网做过这件事。基类是链接和节点。实际的铁路和最终的路线是基于这些。 IIRC我使用std::list
来包含链接和节点,并使用向量向量来包含实际的轨道。
答案 4 :(得分:0)
如果linkID
是Link
的成员,则正确的解决方案是std::set<Link*, OrderByLinkID>
。 OrderByLinkID
谓词将占用两个Link*
,如果第一个具有较小的linkID成员,则返回true。
结果是std :: set仍然包含Link*
,你可以像std :: vector一样迭代它们。相比之下,使用std :: map,你最终会迭代std::pair<Link*, LinkID>
,这是一个更大的变化。