晚上好,我有一个带有一些元素的向量,我有一个元素的地址(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;所以我有另一个向量,其中包含那些名称与输入框中写的名称相似的回顾的地址。 但如果我想删除其中一个,我应该从原始食谱矢量中删除。 所以问题来自这里。
那我怎么能这样做?这可能吗?或者我应该用另一种方法吗?
抱歉英语不好但我是意大利人
答案 0 :(得分:2)
numbers.erase(numbers.begin() + (to_delete - &numbers[0]));
答案 1 :(得分:2)
您可以使用标准函数std::distance
和std::next
来获取要删除的迭代器:
auto to_delete_iter = std::next(numbers.begin(), std::distance(&numbers.front(), to_delete));
您可以使用to_delete_iter
来致电erase
:
numbers.erase(to_delete_iter);
答案 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.
}