gpt4 book ai didi

c++ - 跟踪 vector 元素地址

转载 作者:太空狗 更新时间:2023-10-29 21:44:50 26 4
gpt4 key购买 nike

我想知道是否有一种方法可以跟踪 vector 中元素的地址。

我喜欢使用像 std::vector<MyObject> vec 这样的固体元素 vector 因为:

  • std::vector 为我做所有分配/释放的事情
  • 它还确保我的元素存储在连续的内存中
  • 我可以从所有使用 vector 的代码中获益(例如 <algorithm>)

这正是我想要的。当我想将 vector 元素的地址/引用存储在其他对象中时,问题就出现了。事实上,当 std::vector 需要重新分配内存时,问题才真正出现。

我试图找到解决我的问题的方法:

  • 使用指针 vector/智能指针:不,指针将被连续分配而不是元素

  • 使用指针 vector/智能指针并为 MyObject 编写我自己的 operator new/new[] : 嗯,这似乎更好,但不是。通过使用 vector 来分配我的元素,我可以说:“那些特定的元素集(我在这里不指代 std::set )必须连续分配,而不是全部分配”。事实上,由于我想使用它们的方式,我可能想要其他一组应该连续分配的元素,而使用 vector 来做到这一点正是(我认为)我需要的。这也意味着我正在做我希望 vector 做的工作。

  • 为什么不使用 boost multi-index ? : 在某些方面,这会做我想做的事,因为我想将我的 vector 元素的指针/智能指针存储在其他容器中。但不会再这样了,因为我真的想将 vector 元素的引用/指针/智能指针存储在其他对象中,而不仅仅是其他容器。

我想要的是一个 vector ,它可以给我一个指针对象,它总是指向所需元素的地址,我将这样使用它:

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++ 习惯用法来解决这个问题。

最佳答案

虽然 std::vector 没有给你这样的指针,但你没有理由不能自己做一个。它所需要的只是一个类,该类保留对 std::vector 对象和索引的引用,以及 overloads前缀 operator * 和中缀 operator -> (你需要四个重载 - const 和非 const每个运算符(operator))。

你会像这样使用这个指针:

std::vector<int> vect = {2, 4, 6, 8, 10, 12, 14, 16};
vect_ptr<int> ptr(vect, 5); // <<== You need to implement this
*ptr = 123;
cout << *ptr << endl;

这些重载的实现将获取 std::vectorbegin() 迭代器,并返回调用 vect.at(index )。从外部看,这看起来像是一个指针,但它指向的对象会随着 std::vector 内容的大小调整而改变。

关于c++ - 跟踪 vector 元素地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19138805/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com