C++ C++;如何删除向量中的节点
因此,我创建了一个存储在数组中的二进制搜索树。此二叉搜索树(BST)存储用户输入ID、年龄和名称,然后将其放入按ID升序排序的数组中 我试图编写一个delete函数,它接受用户输入ID,循环遍历向量,如果它找到匹配的ID,它就会删除它 但是,由于出现错误,我似乎无法使BinaryTree.erase()正常工作 严重性代码说明项目文件行抑制状态 错误(活动)E0304没有重载函数“std::vector::erase[with _Ty=Node, _Alloc=std::allocator]“与参数列表项目_4CS210匹配 擦除之后,我计划组织向量,这样就不会有任何开放点,但是,我想确保我可以先删除节点。有什么建议吗?我是一个初学者,所以大部分对我来说都是新的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]“与
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是的,你是对的,谢谢你的评论,我已经改进了答案并添加了更多的解释。