C++ 按地址从向量中删除元素
晚上好,我有一个向量和一些元素,我有其中一个元素的地址(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);
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]
似乎是更好的风格。