stl:向量图 - begin()地址

时间:2015-09-16 08:57:29

标签: c++ dictionary vector stl

如果我指向begin()本身或vector.begin()成员,我一直在争斗几个小时,以了解为什么地图中的second.begin()向量不会返回相同的地址的地图。

让我解释一下:

我有一个包含地图的类,其中键是int,其内容是int的向量。我必须浏览地图并在内存中保留我“之前”的位置,所以我还有另一个迭代器地图(第一张地图)。

所以,我希望得到类似的东西:

  • map1:< 2,< 3,8,1,3,7,1>>
  • map2:< 8,< 6,9,1,3>>
  • map3:< 1,< 3,1>>

为简化起见,在我的代码中,T_IPC_CommandId只是int的枚举。

我有一个名为Add(int TopCommand, int Command)的方法,它填充/创建命令向量的映射。例如,要创建map3,我将编码:

Add(1,3), Add(1,1)

我有一个名为GetNext(int Command)的方法,它在int指向的地图中返回下一个Command。例如,在map2中,调用Get(8)将返回6,下一个调用将返回9,然后13和{{ 1}}用于下次通话。

为了知道我将返回哪个0,我需要为每张地图跟踪下一个int返回的内容。所以,我使用int这是一个映射,其中键是命令本身,并保存迭代器,我在地图中。这是问题所在:

在每次IPC_CommandId_Pointer来电时,我会将此Add()初始化为主地图的开头。像这样:

IPC_CommandId_Pointer

我遇到的问题是,在每个 void T_ListOfCommand::Add(T_IPC_CommandId Top_CommandId, T_IPC_CommandId IPC_CommandId) { T_IPC_CommandId_Vec_Iter Vec_Iter; T_IPC_CommandId_Vec Vec; if ((IPC_CommandId_Map.find(Top_CommandId)) == IPC_CommandId_Map.end()) { IPC_CommandId_Map[Top_CommandId].clear(); } IPC_CommandId_Map[Top_CommandId].push_back(IPC_CommandId); // Repeated at each add, but don't care ... Vec_Iter = IPC_CommandId_Map[Top_CommandId].begin(); IPC_CommandId_Pointer[Top_CommandId] = Vec_Iter; } IPC_CommandId_Map[Top_CommandId].push_back(IPC_CommandId)都不会返回相同的地址。

现在,在更换:

IPC_CommandId_Map[Top_CommandId].begin()

使用:

Vec_Iter = IPC_CommandId_Map[Top_CommandId].begin();
IPC_CommandId_Pointer[Top_CommandId] = Vec_Iter;

这很好用。

我想在地图中使用Vec = IPC_CommandId_Map[Top_CommandId]; IPC_CommandId_Pointer[Top_CommandId] = Vec.begin(); 时指向相同的位置,或者取消引用该向量时,不是吗?好吧,似乎没有。

如果有人能解释我的区别,那就太好了。

2 个答案:

答案 0 :(得分:1)

vector::begin()不保证每次都返回相同的地址!

如果std::vector::push_back()导致向量数据的重新分配(因为它的数据必须是连续的),begin()返回的迭代器(地址)将是不同的。

并且(在评论中说明The Paramagnetic Croissant)代码Vec = IPC_CommandId_Map[Top_CommandId];将地图元素复制到变量Vec。

答案 1 :(得分:0)

(词汇检查:你没有取消引用任何东西,尤其不是矢量。)

Vec_Iter = IPC_CommandId_Map[Top_CommandId].begin();

是映射中向量的迭代器 重新分配向量时,它将变为无效 每次重新分配矢量时,您将获得begin()的不同值 在调用push_back或其他任何可能使迭代器无效的调用中存储此迭代器是个坏主意。

Vec = IPC_CommandId_Map[Top_CommandId];
IPC_CommandId_Pointer[Top_CommandId] = Vec.begin();

是本地副本Vec的迭代器 一旦函数返回它就会变为无效 将此迭代器存储在Vec的生命周期之外是一个坏主意。

总的来说,迭代器应该被认为是瞬态的,只能在尽可能小的范围内使用。

更强大的解决方案是存储"当前索引"对于向量而不是迭代器。