我想知道是否有办法跟踪向量中元素的地址。
我喜欢使用实体元素的向量,例如std::vector<MyObject> vec
,因为:
- std::vector 为我做所有的分配/释放工作
- 它还确保我的元素存储在连续的内存中
- 我可以从所有使用向量的代码中获益(例如
<algorithm>
)
这正是我想要的。当我想将向量元素的地址/引用存储在其他对象中时,就会出现问题。事实上,当 std::vector 需要重新分配内存时,问题就真的出现了。
我试图找到解决问题的方法:
使用指针向量/智能指针:不,指针将连续分配,但不是元素
使用指针向量/智能指针并为 MyObject 编写我自己的运算符 new/new[] :嗯,这似乎更好,但没有。通过使用向量来分配我的元素,我可以说:“那些特定的元素集合(我在这里不指
std::set
)必须连续分配,而不是全部分配”。事实上,由于我想要使用它们的方式,我可能希望拥有其他应该连续分配的元素集,并且使用向量来做到这一点正是(我认为)我需要的。这也意味着我正在做我希望向量做的工作。为什么不使用boost multi-index?:在某些方面会做我想做的,因为我想将我的向量元素的指针/智能指针存储在其他容器中。但不再是因为我真的想将我的向量元素的引用/指针/智能指针存储在其他对象中,而不仅仅是其他容器。
我想要的是一个向量,它可以给我一个指针对象,它总是指向所需元素的地址,我会像这样使用它:
std::vector<MyObject> vec;
// insert some elements
...
// get a pointer object by index or by using an iterator
// does something like that exist?
std::vector<MyObject>::pointer ptr = vec.get_pointer_at(5);
// do what I want on the vector except removing the element
...
// use my pointer whatever reallocations occurred or not
ptr->doSomething();
这听起来像是一个永远不会失效的迭代器,除非我不需要/不想对其执行算术运算(+x、-x、++、--)。
那么,有人可以引导我实现我想要的目标或向我解释为什么/在哪里我想这样做是错误的吗?如果我错过了一个众所周知的解决方案/或者如果这个问题已经得到解答,请接受我对我缺乏 STL 知识的歉意。
编辑:
我认为,如果我必须编写这种指针,这意味着我想要一些无用的东西,或者我在某个地方错了(除非有人应该已经为此编写了模板)。所以我更期待一个经过验证的 C++ 习惯用法来摆脱这个问题。