在c++中,如何改变元素在一个向量中的位置,并对另一个不同的向量进行相同的改变

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

本文关键字:改变 向量 另一个 何改变 c++ 元素 一个 位置      更新时间:2023-10-16

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

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

如果我没有记错,T实际上是一个FIFO队列。每次迭代中的第一个元素都被"从前面弹出"并放置在其他地方。

如果你正在这样做,并且想在任何时候知道T的顺序,其中包括弹出的元素,也许你根本无法将它们从T中删除。只要有一个迭代器或指向下一个要处理的节点的指针。

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

通过这种方式,您永远不会从T中删除元素,只需继续查看下一项即可。大概最后可以把它清理干净。

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

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

通过这种方式,节点标识符会根据堆操作重新排序,并且无论何时从堆中弹出元素(具有最小距离),都可以访问给定其节点标识符的任何您喜欢的信息。