从地址中删除矢量中的元素

时间:2018-04-01 22:45:33

标签: c++ pointers

晚上好,我有一个带有一些元素的向量,我有一个元素的地址(C ++)。我必须用这个地址删除该向量中的元素。 例如..

std::vector<int> numbers(5);
int* to_delete = &numbers[2];
numbers.erase(to_delete); 
// obviously this doesn't work because vector::erase parameter should be an iterator.

这个问题来自我正在完成创建的应用程序。 它是一个食谱应用程序,食谱包含在矢量中。 我添加了&#34;搜索引擎&#34;所以我有另一个向量,其中包含那些名称与输入框中写的名称相似的回顾的地址。 但如果我想删除其中一个,我应该从原始食谱矢量中删除。 所以问题来自这里。

那我怎么能这样做?这可能吗?或者我应该用另一种方法吗?

抱歉英语不好但我是意大利人

3 个答案:

答案 0 :(得分:2)

numbers.erase(numbers.begin() + (to_delete - &numbers[0]));

答案 1 :(得分:2)

您可以使用标准函数std::distancestd::next来获取要删除的迭代器:

auto to_delete_iter = std::next(numbers.begin(), std::distance(&numbers.front(), to_delete));

您可以使用to_delete_iter来致电erase

numbers.erase(to_delete_iter);

Demo.

答案 2 :(得分:2)

虽然

int* to_delete = &numbers[2];
numbers.erase(numbers.begin() + (to_delete - &numbers[0]));

会工作,有陷阱。如果在两行之间添加任何新项目和/或从numbers中删除现有项目,则代码将导致未定义的行为。但是,在这种情况下,取消引用指针也会导致未定义的行为。

如果可能,将索引存储在客户端代码中,当需要使用std::vector对象的句柄时,从index访问元素,并使用索引删除元素。

std::vector<int> numbers(5);

size_t index = 2;  // Make sure to use index only after this.

// Access the element using index.
// Use numbers[index];

// Delete the element using the index
if ( index < numbers.size() )
{
   numbers.erase(numbers.begin() + index); 
}
else
{
   // Index is no longer valid.
   // Can't erase from the vector.
}