指向 vector 元素的 C++ 指针,元素已删除

标签 c++ pointers vector

我希望这是一个简单的问题..

我有一个元素 vector 。这些元素是我自己的类类型。我维护一个指向该 vector 的特定成员的指针。

问题是:如果我从 vector 中删除元素,指针会发生什么变化?

子问题:

  • 在遍历 vector 时,有什么方法可以检查迭代器是否指向我当前拥有指针的元素? vIterator == pElement 会这样做吗?
  • 有没有什么方法可以从 vector 中删除元素,只需要一个指向该元素的指针?如果上一个问题的答案是肯定的,那么我想我可以用循环来完成。

提前致谢!

最佳答案

  1. 它现在将指向无效内存a 或指向不同的对象。通常,使用该指针现在是未定义的行为。
  2. if(&*vIterator == ptr)
        ... 
    

    * 从迭代器中获取对对象的引用,& 为您提供其地址。请注意,虽然 &* 是指针上的空操作,但这里我们需要它,因为迭代器重载了 *

  3. 您可以使用线性搜索,但效率低得不必要。您可以利用存储是连续的这一事实,并执行以下操作:

    vec.erase(vec.begin()+(ptr-&vec[0]));
    

    ptr-&vec[0] 根据通常的指针算法为您提供 vector 中的索引,并将它添加到开始迭代器会产生指向它的迭代器。


一个。从技术上讲, vector 不允许在删除元素时释放内存,因此更正确的说法是它可能指向一个无效的(=已经被销毁的)对象。

关于指向 vector 元素的 C++ 指针,元素已删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23693514/

相关文章:

c++ - 如何找到 key 大于 val 的映射的第一个元素

c++ - 优化器删除指针取消引用行

Java OpenGL(JOGL) 对象数组和 FloatBuffer

C++ "select"算法

c++ - std::shared_ptr 初始化:make_shared<Foo>() vs shared_ptr<T>(new Foo)

android - 仅通过 native 代码检查 apk 中是否存在目录(文件夹)

c++ - 这是在 C++ 中释放指针内存的正确方法吗

c - 如果字符串在内存中重叠怎么办?

c - 在 C 和 cython 中使用结构

c++ - 我如何使用 std::allocator 代替 realloc?