【问题标题】:Use pointers to items in a vector, and deleting items from the vector使用指向向量中项目的指针,并从向量中删除项目
【发布时间】:2013-07-04 13:26:13
【问题描述】:

我有某个类的 std::vector,在我的程序中我有一些指向向量中几个项目的指针,问题是当我删除一个项目时,例如第一个项目,所有指针都是错误的,这是代码示例:

vector<int> numbers;
numbers.push_back(100);
numbers.push_back(200);
numbers.push_back(300);

int *pNum = & numbers[1]; // pNum pointer to 200

numbers.erase(numbers.begin()); // now pNum pointer to 300

我明白为什么会这样,问题是有没有办法解决这个问题?

【问题讨论】:

  • 复制你想要的数据。
  • 我希望pNum 始终是指向包含值 200 的单元格的指针
  • 正在创建一个删除数据并更新指针选项的函数?如果有人删除值 200 会发生什么?
  • 可能有点矫枉过正,为什么不用指针呢?所以,你的向量看起来像:std::vector&lt;std::unique_ptr&lt;int&gt;&gt;,那么你不会被重定位击中......
  • @nim,我认为应该使用 shared_ptr,因为 200 它在 pNum 和数字之间共享。

标签: c++ arrays pointers containers stdvector


【解决方案1】:

您可以使用基于节点的结构,例如std::list。这保证了除已擦除元素之外的迭代器仍然有效。

缺点是您没有随机访问权限,并且数据不连续。

【讨论】:

  • 是的,只是std::list占用更多内存
【解决方案2】:

您可以将指针保存在向量中。这样,您就可以将数据与向量分开,并且您的参考点指向真实数据。

vector<int*> numbers;

numbers.push_back(new int(100));
numbers.push_back(new int(200));
numbers.push_back(new int(300));

int * pNum  = numbers[1];

// memory leak!!!
numbers.erase( numbers.begin() );

cout << *pNum << endl;

如果您使用 c++11,则使用 shared_ptrs 代替原始指针是安全的。

【讨论】:

    猜你喜欢
    • 2011-12-19
    • 1970-01-01
    • 1970-01-01
    • 2013-05-28
    • 1970-01-01
    • 2018-08-09
    • 1970-01-01
    • 1970-01-01
    • 2013-07-02
    相关资源
    最近更新 更多