按地址从矢量中删除元素
Erase an element from vector by address
晚上好,我有一个包含一些元素的向量,并且我有其中一个元素的地址(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
中删除现有项,则代码将导致未定义的行为。但是,在这种情况下,取消引用指针也会导致未定义的行为。
如果可能,将索引存储在客户端代码中,当您需要使用index
从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.
}
numbers.erase(numbers.begin() + (to_delete - &numbers[0]));
您可以使用标准函数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);
演示。
相关文章:
- 如何从存储在std::映射中的std::集中删除元素
- 从嵌套在std::映射中的std::列表中删除元素的最佳方式
- 从矢量中删除元素后出现隔离错误
- 如何使用remove_if从矢量中删除元素
- 如何从使用 for 循环中的矢量大小的矢量中删除元素
- C++映射不删除元素
- 如何从标准::元组中删除元素?
- 在动态数组中添加/删除C++元素
- 如何通过比较彼此的成员从QStringList中删除元素
- 如何修复从矢量中删除元素的错误?
- 从 std::set 中删除元素,同时在 C++17 中迭代该元素
- 使用remove_if从矢量中删除元素
- 用C++从三维矢量中删除元素
- 从对象数组中删除元素
- 如何在不使用 vector::erase() 的情况下编写自定义 Vector 方法来删除元素?
- C++ - 按自定义数据类型向量的值删除元素
- 从任意容器中廉价删除元素的惯用方法?
- 从数组中删除元素不起作用的函数
- 删除元素 BST
- 从向量中删除元素时未处理的异常