c++ - 在 for 循环中调用一个函数来删除 vector (或列表)中的元素

标签 c++ class vector memory-management erase-remove-idiom

vector<node>::iterator it;
for(it;it!=vector_of_node.end();it++){
    if(it->get_name()=="MARIA"){
        vector_of_node.erase(it);
}

我希望我的代码目标明确。我想从 vector (在本例中为 vector_of_nodes)中消除多个对象(在称为节点的类中描述)。 当我运行我的代码时,我没有从编译器那里得到任何错误,但是我在它运行时失败了。我确定错误出在我共享的这部分代码上。你能帮帮我吗?

最佳答案

通过一次删除一个对象来消除 vector 中的多个对象是非常低效的。每次 erase 调用都会将右侧的所有元素移动一个位置。已经有一个标准库模式可以更好地做到这一点,使用 std::remove :

std::erase(std::remove_if(vector_of_node.begin(),
                          vector_of_node.end(),
                          [](const node& n) { return n->get_name() == "MARIA"; }),
           vector_of_node.end());

std::remove_if 的结果是重新排列的 vector ,所有匹配都移到了末尾,它返回一个指向第一个匹配的迭代器。然后调用 std::erase 将它们全部删除。

关于c++ - 在 for 循环中调用一个函数来删除 vector (或列表)中的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59163715/

相关文章:

mysql - 使用 R 操作向量值

在序列中每隔 n 个重复第 n 个元素

C++ - reference& operator= 在这里做什么

python - ctypes库如何实现基本数据类型乘法来生成数组?

javascript - 检查 Javascript 命名空间中的类类型是否可用

javascript - javascript 类的原型(prototype)语法错误

c++ - 删除C++ vector 中的字段

c++ - 有什么方法可以在不对所有内容使用动态内存的情况下使用 Qt 吗?

c++ - 互斥实现可以互换吗(独立于线程实现)

c++ - 可以在 C++11 lambda 中隐式捕获参数包吗?