C++ 按地址从向量中删除元素

C++ 按地址从向量中删除元素,c++,pointers,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. std::向量数(5);

晚上好,我有一个向量和一些元素,我有其中一个元素的地址(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.
std::向量数(5);
int*to_delete=&number[2];
数字。删除(删除);
//显然这不起作用,因为vector::erase参数应该是迭代器。
这个问题来自我正在完成创建的应用程序。 这是一个配方应用程序,配方包含在一个向量中。 我添加了“搜索引擎”,这样我就有了另一个向量,其中包含了那些名字与输入框中的名字相似的recips的地址。 但是如果我想删除其中一个,我应该从原始配方向量中删除。 所以问题就出在这里

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


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

您可以使用标准函数和获取要删除的迭代器:

numbers.erase(numbers.begin() + (to_delete - &numbers[0]));
auto to_delete_iter = std::next(numbers.begin(), std::distance(&numbers.front(), to_delete));
您可以使用
删除\u iter
调用
擦除

numbers.erase(to_delete_iter);

您可以使用标准函数和获取要删除的迭代器:

auto to_delete_iter = std::next(numbers.begin(), std::distance(&numbers.front(), to_delete));
您可以使用
删除\u iter
调用
擦除

numbers.erase(to_delete_iter);

int* to_delete = &numbers[2];
numbers.erase(numbers.begin() + (to_delete - &numbers[0]));
如果成功,就会有陷阱。如果两行之间的
number
中添加了任何新项目和/或删除了现有项目,则代码将导致未定义的行为。但是,在这种情况下,取消对指针的引用也会导致未定义的行为

如果可能,将索引存储在客户机代码中,在需要使用
索引
的对象句柄时,从
std::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.
}
std::向量数(5);
大小索引=2;//确保仅在此之后使用索引。
//使用索引访问元素。
//使用数字[索引];
//使用索引删除元素
如果(索引

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

如果可能,将索引存储在客户机代码中,在需要使用
索引
的对象句柄时,从
std::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.
}
std::向量数(5);
大小索引=2;//确保仅在此之后使用索引。
//使用索引访问元素。
//使用数字[索引];
//使用索引删除元素
如果(索引
请记住,删除操作可能会使“搜索结果”向量中的结果无效。可能使用一个向量,其中每个条目是一个配方的SyrdY-PTR,所以我会从搜索结果向量中删除元素tooMaybe你应该考虑将索引存储到另一个向量而不是指针的值。例如,第一个食谱。然后所有指针或索引突然指向它们的邻居。更糟糕的是,如果向量将其内容移动到内存中的新位置,则所有指针都指向已释放的内存。请记住,删除操作可能会使“搜索结果”向量中的结果无效。可能使用一个向量,其中每个条目是一个配方的SyrdY-PTR,所以我会从搜索结果向量中删除元素tooMaybe你应该考虑将索引存储到另一个向量而不是指针的值。例如,第一个食谱。然后所有指针或索引突然指向它们的邻居。更糟糕的是,如果向量将其内容移动到内存中的一个新位置,那么所有指针都指向已释放的内存。可能没有什么区别,但使用
numbers.data()
而不是
&numbers[0]
似乎更好。可能没有什么区别,但使用
numbers.data()
而不是
&数字[0]
似乎是更好的风格。