C++ C++;:存储旧int句柄和新int句柄之间的映射

C++ C++;:存储旧int句柄和新int句柄之间的映射,c++,arrays,sorting,dictionary,mapping,C++,Arrays,Sorting,Dictionary,Mapping,我有一个包含struct元素的数组。我需要从数组中删除一些元素,并存储旧值之间的映射​​还有新的 即,fill std::map,其键是数组中元素的旧索引,其值是数组中的新索引。(因为当​​如果从矢量中删除,则该矢量将向左移动。) 我将用一个例子说明我需要什么: 0 1 2 3 4 5 6 arr0 = {a, b, c, d, e, f, g} 0 1 2 3 4 5 arr1 = {a, b, c, e, f, g} //after de

我有一个包含struct元素的数组。我需要从数组中删除一些元素,并存储旧值之间的映射​​还有新的

即,fill std::map,其键是数组中元素的旧索引,其值是数组中的新索引。(因为当​​如果从矢量中删除,则该矢量将向左移动。)

我将用一个例子说明我需要什么:

        0  1  2  3  4  5  6
arr0 = {a, b, c, d, e, f, g}
        0  1  2  3  4  5
arr1 = {a, b, c, e, f, g} //after delete d

map[0]=0 // a
map[1]=1 // b
map[2]=2 // c
map[4]=3 // e
map[5]=4 // f
map[6]=5 // g
帮我实现这个。 我有一个来自以下结构的数组:

 struct HalfEdgeHandle { int64_t index = -1; };

 std::vector<HalfEdgeHandle> halfEdges = {};
 
struct HalfEdgeHandle{int64_t index=-1;};
std::向量半边={};

我需要删除包含半边[I]的数组元素。索引==-1

只要我理解了您的问题,这应该是解决方案:

struct HalfEdgeHandle{};
std::向量半边={};
//这里将数据存储到向量中
地图;
std::向量拷贝;
int j=0;
对于(int i=0;i
copy
应该是
std::vector
,不包含任何具有
索引==-1
的元素<代码>地图
将如您所述

让我指出两件事:

  • 考虑将
    映射
    复制
    变量名更改为代码中更有意义的名称
  • 考虑更改存储以前索引和新索引的方式。我会交换键值对,这样就有了连续索引。如果您这样做,您可以使用
    std::vector
    而不是
    std::map
    (如果不是强制性的,我通常会避免使用
    std::map

您刚才问过同样的问题吗?我记得以前几乎一字不差地看过。如果你这样做了,请以后不要这样做。改为改进您的问题。此问题已被提出,然后被删除。许多有效的评论现在已经被遗忘了。另外,请阅读,接受SO,阅读,以及。最后,请学习如何创建一个你自己的尝试。甚至有一个答案,可能已经解决了这个问题。由于评论中有更多细节,实际问题现在还不清楚,更糟的是,这个问题模棱两可。您对每个角色的原始位置感兴趣吗?在您的示例中,将所有元素向左移动后,更多字符的位置将发生变化。此外,每次删除后移动所有元素也不便宜(在最坏的情况下是O(n))。更好的方法是将它们与最后一个元素交换,并减少指向列表末尾的指针。重要的一点是,在这种情况下,您可能需要考虑所选元素是否是有效成员的最后一个元素。谢谢,这很好。solution@Torney完美的请看我刚才补充的最后两件事。那么,如果你满意的话,你能批准这个答案并投票吗?谢谢,我很想投票给你,但是我没有足够的票数reputation@Torney哦,我明白了。你至少应该能够将此标记为答案(只需单击左侧的勾号。这有助于提高我的声誉,并帮助所有与你有相同问题的人。如果你不想或不想,没关系!