C++ vector元素被delete 问题记录

如果vector中的元素被外部delete 会发生什么?


测试代码如下

#include <iostream>
#include <vector>

class A
{
public:
    std::string name = "";
    int id;
    A(std::string name, int id)
    {
        this->name = name;
        this->id = id;
    }
};

int main(int argc, char** argv)
{
    std::vector<A*> vec;
    A* a1 = new A("a1", 1);
    A* a2 = new A("a2", 2);
    A* a3 = new A("a3", 3);

    vec.emplace_back(a1);
    vec.emplace_back(a2);
    vec.emplace_back(a3);

    delete a1;

    // std::erase_if(vec, [](A* a) { return a->id == 1; });

    std::cout << vec.size() << std::endl;

    for (const auto value : vec)
    {
        std::cout << value->name << std::endl;
    }
}

输出结果为

3

如果delete a2呢?结果就是

3
a1

delete a3以此类推

那么如果想要删除vector中的元素,建议使用erase_if
例如在我这个例子里面
std::erase_if(vec, [](A* a) { return a->id == 1; });
就可以把id为1的元素,也就是a1删除掉,输出结果为

2
a2
a3

符合我的预期,我使用c++20标准,不保证其他标准也能使用

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
#include<iostream> #include<string> #include<fstream> #include <vector> #include <functional> #include <algorithm> #include<string> using namespace std; class Employee{ protected: int number; string name; public: Employee(){} Employee(int num,string nam); void setname(string n); void setnumber(int n); string getname(void); int getnumber(void); virtual void display(void); friend bool less_number(const Employee & m1, const Employee & m2); }; class EmployeeDetial:public Employee{ protected: string sex; int age; public: EmployeeDetial(){} EmployeeDetial(int num,string nam,string se,int ag); void setsex (string s); void setage(int a); string getsex(void); int getage(void); void display(void); friend bool less_age(const EmployeeDetial & m1, const EmployeeDetial & m2); }; void Employee::setname(string n){ name=n; } void Employee::setnumber(int n){ number=n; } string Employee::getname(void){ return name; } int Employee::getnumber(void){ return number; } void Employee::display(void){ // cout<<"E.display"<<endl; cout<<number<<" "<<name<<endl; } void EmployeeDetial::setsex(string s){ sex=s; } void EmployeeDetial::setage(int a){ age=a; } string EmployeeDetial::getsex(void){ return sex; } int EmployeeDetial::getage(void){ return age; } void EmployeeDetial::display(void){ // cout<<"ED.display"<<endl; cout<<number<<" "<<name<<" "<<sex <<" "<<age<<" "<<endl; } EmployeeDetial::EmployeeDetial(int num,string nam,string se,int ag){ number=num; name=nam; sex=se; age=ag; } Employee::Employee(int num,string nam){ number=num; name=nam; } bool less_number(const Employee & m1, const Employee & m2) { return m1.number<m2.number; } bool less_age(const EmployeeDetial & m1, const EmployeeDetial & m2) { return m1.age<m2.age; } using namespace std; static int counter=0; vector<EmployeeDetial> vED; vector<Employee> vE; void load_f_ED(){ int num,age; string name,sex; ifstream fin("EmployeeDetial.txt"); if(!fin){ cout<<"open file error!"<<endl; exit(1); } while(fin>>num>>name>>sex>>age){ // fin>>num>>name>>sex>>age; vED.push_back(EmployeeDetial(num,name,sex,age)); counter++; } fin.close(); } bool load_f_E(){ int num; string name; ifstream fin("Employee.txt"); if(!fin)return false; while(fin>>num>>name){ // fin>>num>>name>>sex>>age; vE.push_back(Employee(num,name)); } fin.close(); return true; } void display_E(){ for(int i=0;i<counter;i++)vE.at(i).display(); } void display_ED(){ for(int i=0;i<counter;i++){ vED.at(i).display(); } } void E_fout(){ ofstream fout("Employee.txt"); for(int i=0;i<counter;i++){ fout<<vE.at(i).getnumber()<<" "<<vE.at(i).getname()<<"\n"; } fout.close(); } void ED_fout(){ ofstream fout("EmployeeDetial.txt"); for(int i=0;i<counter;i++){ fout<<vED.at(i).getnumber()<<" "<<vED.at(i).getname()<<" "<< vED.at(i).getsex()<<" "<<vED.at(i).getage()<<"\n"; } fout.close(); } void E_ED(){ for(int i=0;i<counter;i++)vE.push_back(Employee(vED.at(i).getnumber(),vED.at(i).getname())); } void add(){ int num,age; string name,sex; cout<<"input the number:"<<endl; cin>>num; cout<<"input the name:"<<endl; cin>>name; cout<<"input the sex:"<<endl; cin>>sex; cout<<"input the age:"<<endl; cin>>age; vED.push_back(EmployeeDetial(num,name,sex,age)); vE.push_back(Employee(num,name)); counter++; cout<<"add success!"<<endl; } void delet(){ int a; cout<<"input the number which you want to delete:"<<endl; cin>>a; for(int i=0;i<counter;i++){ if(vED.at(i).getnumber()==a){ for(int n=i;n<counter-1;n++){ vED.at(n)=vED.at(n+1); vE.at(n)=vE.at(n+1); } } } counter--; } void screen(){ cout<<"1. 增加职工记录"<<endl; cout<<"2. 删除职工记录"<<endl; cout<<"3. 生成信息简表"<<endl; cout<<"4. 显示原始记录"<<endl; cout<<"5. 显示简表记录"<<endl; cout<<"6. 原始记录排序"<<endl; cout<<"7. 简表记录排序"<<endl; cout<<"8. 结束程序运行"<<endl; } int dd(){ int a; screen(); cin>>a; return a; } void ED_sort_age(){ sort(vED.begin(), vED.end(), less_age); } void ED_sort_number(){ sort(vED.begin(), vED.end(), less_number); } void E_sort_number(){ sort(vE.begin(), vE.end(), less_number); } int main(){ int a=dd(); while(a!=8){ load_f_ED(); if(!load_f_E())E_ED(); switch(a){ case 1: add();break; case 2:delet();break; case 3: E_fout();cout<<"success!"<<endl;break; case 4: display_ED();break; case 5:display_E();break; case 6:cout<<"1.按number排序"<<endl; cout<<"2.按age排序"<<endl; cin>>a; if(1==a){ED_sort_number();display_ED();break;} if(2==a){ED_sort_age();display_ED();break;} case 7:E_sort_number();display_E();break; default:cout<<"what are you doing?"<<endl;;break; } ED_fout(); E_fout(); vED.clear(); vE.clear(); counter=0; a=dd(); } return 0; }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值