如何从向量中删除一个结构元素?

3

我是一名新手程序员,正在编写一个管理宠物旅馆登记的程序(这只是课堂上的一些愚蠢练习,不要紧)。我使用向量来保存结构体元素(宠物)。结构体的代码如下:

struct Pets{
string Name;
string Race;
string Owner;
int Tel;
}p;

询问用户输入的函数如下:

AddPet(vector<Pets> &vtnew)
{
Pets newpet;
cout << "Enter the pet's name: " << endl;
cin >> newpet.Name;
cout << "Enter the pet's race: " << endl;
cin >> newpet.Race;
cout << "Enter the owner's name: " << endl;
cin >> newpet.Owner;
cout << "Enter the owner's telephone number: " << endl;
cin >> newpet.Tel;
vtnew.push_back(newpet);
}

好的,现在我需要创建一个函数来通过名称或其他方式删除宠物。有没有什么方法可以做到这一点?


你应该先读一本关于C++的入门书。 - Lingxi
1
你使用了 std::vector 的函数 push_back() 将它们添加进去。看一下还有哪些其他的 std::vector 函数可以帮助你移除一个元素! - NoseKnowsAll
1
еҰӮжһңдҪ зҡ„зЁӢеәҸжғіиҰҒдҪҝз”Ёе® зү©зҡ„еҗҚеӯ—дҪңдёәй”®жқҘжҹҘжүҫзӣёе…ізҡ„Petsз»“жһ„пјҢдҪҝз”Ёstd::map<std::string, Pets>жҜ”дҪҝз”ЁvectorжӣҙиҮӘ然 - дҪ еҸҜд»ҘйҖҡиҝҮvtnew[newpet.Name] = newpet;жқҘж·»еҠ е® зү©пјҲеҸҜиғҪйңҖиҰҒе°ҶvtnewеҸҳйҮҸеҗҚжӣҙж”№дёәжӣҙе…·жҸҸиҝ°жҖ§зҡ„еҗҚз§°пјүпјҢ并йҖҡиҝҮvtnew.erase(some_pet_name);жқҘеҲ йҷӨгҖӮ - Tony Delroy
@TonyD:不,那不是正确的容器。map 用于外部键,set 用于内部键。但是,您需要提供自己的 OrderPetsByName 比较函数。 - MSalters
@MSalters:set<>的内存利用率更高,但考虑到Dave刚开始学习这个,使用map更方便且功能齐全。(或者如果名称不保证唯一,可以考虑使用multimap)。 - Tony Delroy
1个回答

13

向量是一个未排序的容器,因此简单的解决方案是您唯一的选择。

void RemovePet(std::vector<Pet> & pets, std::string name) {
    pets.erase(
        std::remove_if(pets.begin(), pets.end(), [&](Pet const & pet) {
            return pet.Name == name;
        }),
        pets.end());
}

这被称为Erase-remove惯用语

请注意,这将删除所有与该名称匹配的宠物,而不仅仅是一个。


对不起,宠物是什么东西?是结构体的名称还是对象?谢谢。 - Dave Carballo
@DaveCarballo:这就在函数原型中:std::vector<Pet> & pets - Bill Lynch
不好意思,请问我之后要如何调用这个函数?我应该使用哪些参数? - Dave Carballo
@DaveCarballo: 在调用 RemovePet(vtnew, "Fluffy"); 后,调用者的 vector 变量 - 也就是被命名为 vtnew(或者你更改的更好的名称)的变量,将会被 RemovePet 中的 pets 引用。 - Tony Delroy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接