如果我指向begin()
本身或vector.begin()
成员,我一直在争斗几个小时,以了解为什么地图中的second.begin()
向量不会返回相同的地址的地图。
让我解释一下:
我有一个包含地图的类,其中键是int
,其内容是int
的向量。我必须浏览地图并在内存中保留我“之前”的位置,所以我还有另一个迭代器地图(第一张地图)。
所以,我希望得到类似的东西:
为简化起见,在我的代码中,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
,然后1
,3
和{{ 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();
时指向相同的位置,或者取消引用该向量时,不是吗?好吧,似乎没有。
如果有人能解释我的区别,那就太好了。
答案 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
的生命周期之外是一个坏主意。
总的来说,迭代器应该被认为是瞬态的,只能在尽可能小的范围内使用。
更强大的解决方案是存储"当前索引"对于向量而不是迭代器。