1

我有某个类的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

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

4

2 回答 2

1

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

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

于 2013-07-04T13:30:32.623 回答
0

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

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 而不是原始指针是安全的。

于 2013-07-04T13:55:14.307 回答