C++ C++;如何删除向量中的节点

C++ C++;如何删除向量中的节点,c++,vector,nodes,erase,C++,Vector,Nodes,Erase,因此,我创建了一个存储在数组中的二进制搜索树。此二叉搜索树(BST)存储用户输入ID、年龄和名称,然后将其放入按ID升序排序的数组中 我试图编写一个delete函数,它接受用户输入ID,循环遍历向量,如果它找到匹配的ID,它就会删除它 但是,由于出现错误,我似乎无法使BinaryTree.erase()正常工作 严重性代码说明项目文件行抑制状态 错误(活动)E0304没有重载函数“std::vector::erase[with _Ty=Node, _Alloc=std::allocator]“与

因此,我创建了一个存储在数组中的二进制搜索树。此二叉搜索树(BST)存储用户输入ID、年龄和名称,然后将其放入按ID升序排序的数组中

我试图编写一个delete函数,它接受用户输入ID,循环遍历向量,如果它找到匹配的ID,它就会删除它

但是,由于出现错误,我似乎无法使BinaryTree.erase()正常工作

严重性代码说明项目文件行抑制状态 错误(活动)E0304没有重载函数“std::vector::erase[with _Ty=Node, _Alloc=std::allocator]“与参数列表项目_4CS210匹配

擦除之后,我计划组织向量,这样就不会有任何开放点,但是,我想确保我可以先删除节点。有什么建议吗?我是一个初学者,所以大部分对我来说都是新的

Here's my delete function. 


#include "BinaryTree.h"
#include <string>
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;
int index;

struct Node
{
    int ID;
    int age;
    string name;

    Node()
    {

    }

    Node(int id, int Age, string nm)
    {
        this->ID = id;
        this->age = Age;
        this->name = nm;
    }
};
vector<Node> binaryTree;
void BST::Delete()
{
    int input_id;
    cout << "What is the ID of the person to be deleted" << endl;
    cin >> input_id;

    for (unsigned int i = 0; i < binaryTree.size(); i++)
    {
if (input_id == binaryTree.at(i).ID)
        binaryTree.erase(i);



    }
}
这是我的删除函数。
#包括“BinaryTree.h”
#包括
#包括
#包括
#包括
使用名称空间std;
整数指数;
结构体类型
{
int-ID;
智力年龄;
字符串名;
节点()
{
}
节点(int-id、int-Age、字符串nm)
{
这个->ID=ID;
这个->年龄=年龄;
此->名称=nm;
}
};
向量二叉树;
void BST::Delete()
{
int输入_id;
无法输入_id;
for(无符号int i=0;i
采用迭代器,而不是索引

您可以使用
binaryTree.begin()+i
获取向量的第i个元素的迭代器(请注意,有些容器的迭代器类型没有
+
,因此您需要在那里使用)

总的来说,
binaryTree.erase(binaryTree.begin()+i)
应该可以完成您想要的工作,但是对于您试图完成的工作,您也可以进行研究

要进一步阐述最后一点(因为评论中有人提到了“删除/擦除”习惯用法):

vector.erase(std::remove_if(vector.begin()),
vector.end(),
[](常量自动和元素){返回条件(元素);}),
vector.end());
这将从向量中删除所有元素,其中
条件(元素)
返回
true
,通常比手动迭代向量要好:

  • 如果要使用方法删除多个元素,可能会遗漏一些元素。取一个向量,其中要删除的元素位于索引
    i
    i+1
    处。然后,您通常删除索引
    i
    处的元素,并且
    i+1
    处的元素移动到索引
    i
    ——但是,在下一次迭代中,您已经选中了索引
    i+1
    ,因此您错过了要删除的项

  • 每次从向量中删除一个元素时,后面的所有元素都会在内存中移动。如果你的物品相当大,那可能会很贵。使用
    remove\u if
    应确保每个元素的移动不会超过需要,尤其是在删除多个元素时,移动效率更高


您不应该在对向量进行迭代时从向量中删除元素,迭代时可能会丢失一些索引,如果在向量末尾使用
std::remove\u发送需要删除的元素,然后使用
erase()
方法从向量中删除它们:

auto It = std::remove_if(binaryTree.begin(), binaryTree.end(), [input](const Node& node)
         {
             if( node.ID == input )
             {
                 return true;
             }
             return false;

         });
binaryTree.erase(It,binaryTree.end());

方法
erase()
接受迭代器以删除范围,或接受一个迭代器以删除一个元素
std::remove_if
将返回迭代器,用于最后推送到remove的第一个元素。

考虑到您希望删除向量中的所有项或特定项。实际上,您可以在迭代时使用
erase
从向量中删除项。请记住,
erase
实际上为您提供了下一项的迭代器。因此,除非迭代器满足条件,否则可能不需要增加迭代器

下面是一个示例代码:

for (std::vector<Node>::iterator it =  binaryTree.begin(); it != binaryTree.end();)
{
    if(it == yourItem) //Conditional check if it matches with your object.
    {
       it =  binaryTree.erase(it);
    }
    else
    {
       ++it;
    }
}
for(std::vector::iterator it=binaryTree.begin();it!=binaryTree.end();)
{
if(it==yourItem)//条件检查它是否与对象匹配。
{
it=binaryTree.erase(它);
}
其他的
{
++它;
}
}

您可以看到,我实际上是让迭代器指向列表中的下一项,而不增加它。你可以用任何你喜欢的方式处理它。

请提供一个不以
int
作为参数的参数。你应该使用删除/擦除习惯用法来处理这个问题,不要再尝试重新发明轮子。我的问题是,为什么你认为这会起作用,如果你像他一样迭代向量的大小,而不是使用迭代器(或循环范围)@hlt是的,你是对的,谢谢你的评论,我已经改进了答案并添加了更多的解释。