按地址从矢量中删除元素

Erase an element from vector by address

本文关键字:删除 元素 地址      更新时间:2023-10-16

晚上好,我有一个包含一些元素的向量,并且我有其中一个元素的地址(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.

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

那么我该怎么做呢?这可能吗?还是我应该用另一种方法?

对不起,英语不好,但我是意大利人

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

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

如果可能,将索引存储在客户端代码中,当您需要使用indexstd::vector访问元素时,也可以使用索引删除元素。

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.
}
numbers.erase(numbers.begin() + (to_delete - &numbers[0]));

您可以使用标准函数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);

演示。