用地图代替矢量

时间:2012-03-09 07:26:06

标签: c++ vector map

我正在扩展已有的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等非常小的修改。

所以我明显的问题是: 是否可以使用地图代替矢量(任何方式)。 换句话说,我想创建一个地图,填充它,然后将其视为矢量。可能? 感谢您的评论

5 个答案:

答案 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)

如果linkIDLink的成员,则正确的解决方案是std::set<Link*, OrderByLinkID>OrderByLinkID谓词将占用两个Link*,如果第一个具有较小的linkID成员,则返回true。

结果是std :: set仍然包含Link*,你可以像std :: vector一样迭代它们。相比之下,使用std :: map,你最终会迭代std::pair<Link*, LinkID>,这是一个更大的变化。