繁体   English   中英

在c ++中,如何更改向量中元素的位置,并对其他不同向量进行相同的更改?

[英]In c++, how to change the position of elements in a vector and do the same changes to an other different vector?

我有2个向量,y和T最初大小相同,它们需要像这样保持分开。 我一直循环执行,直到T为空,并且每次循环时,T的第一个元素都用于算法,然后从向量T中删除并推入向量S(最初为空)。 每个循环,向量y中的某些值都会改变,我需要对它们进行排序。 我的问题是:当我对y进行排序时,如果y [2]和y [3]交换,则需要在第一个循环之前交换T中位于[2]和[3]的元素!

我知道这看起来很奇怪,但这是针对我的Graph项目的Dijkstra算法。 我了解是否不清楚,如果有需要,我会尽力澄清。 任何建议对我都会非常有帮助! 谢谢!

如果我正确地跟随您,那么T实际上是FIFO队列。 每次迭代中的第一个元素都被“弹出前端”并放置在其他位置。

如果您正在执行此操作,并且希望在任何时候知道T的顺序,其中包括弹出的元素,那么也许根本无法将它们从T中删除。 只需具有一个迭代器或指向下一个要处理的节点的指针即可。

该节点可以复制到S,或者如果复制成本很高,则S可能仅包含指向该节点的指针。

这样,您就不会真正从T中删除元素,只需继续看下一项即可。 大概可以在最后将其清除。

对于Dijkstra算法 ,通常使用二进制堆来实现优先级队列,并以到源节点的距离从小到大的顺序访问节点。 每次访问时,相邻距离可能会更新( 放松操作),因此相应的队列元素会更改优先级( 减小键操作)。

与其直接使用距离作为堆元素的 ,不如使用节点标识符 (或指针)。 但是也可以使用比较函数 (例如在std :: make_heap和大多数STL算法中),在给定两个节点标识符的情况下,该函数比较相应的距离。

这样,节点标识符将根据堆操作进行重新排序,并且每当您从堆中弹出一个元素(具有最小距离)时,就可以根据其节点标识符访问喜欢的任何信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM