使用指向矢量中的项目的指针,以及从矢量中删除项目

时间:2013-07-04 13:26:13

标签: c++ arrays pointers containers stdvector

我有一些类的std :: vector,在我的程序中我有一些指向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

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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_ptr而不是原始指针是安全的。