C++ 在向量迭代C+中比较两个对象+;

C++ 在向量迭代C+中比较两个对象+;,c++,vector,comparison-operators,C++,Vector,Comparison Operators,在这种情况下,如何实现比较功能 void remove(const Object1 &object1) { for(auto &object2 : objectVector) { if(object1 == object2) { /*....... */ } } } 如果object是一个类,您可以将类中的运算符==作为友元函数重写,或者您可以实现自己的函数bool isEqual(Object1 o1,

在这种情况下,如何实现比较功能

void remove(const Object1 &object1) {
    for(auto &object2 : objectVector) {
        if(object1 == object2) {
            /*....... */
        }
    }
} 

如果object是一个类,您可以将类中的运算符==作为友元函数重写,或者您可以实现自己的函数bool isEqual(Object1 o1,Object1 o2){if(something)return true;return false;}

您提出了两个问题:

  • 如何使对象具有可比性:
  • 通过为类实现
    操作符==
    。确保覆盖
    运算符=然后也是

    作为成员职能:

    bool Object1::operator ==(const Object1 &b) const
    {
        // return true if *this equals b;
    }
    
    bool operator ==(const Object1 &a, const Object1 &b)
    
    或作为自由函数:

    bool Object1::operator ==(const Object1 &b) const
    {
        // return true if *this equals b;
    }
    
    bool operator ==(const Object1 &a, const Object1 &b)
    
  • 如何从向量中删除具有给定值的对象:
  • 最简单的方法是使用
    std::remove

    objectVector.erase(std::remove(objectVector.begin(), objectVector.end(), object1), objectVector.end());
    

    您也可以在遍历向量时删除对象,但是您必须记住,向量迭代器随后将失效。然后,您可能不会进一步迭代向量。

    类的对象可以包含不同类型和不同数量的成员,因此假设您有一个类
    a

    class A{
        int x,
        float y;
        char* z;
    };
    
    你有两个例子:

    A a1;
    A a2;
    
    比较:

    if(a1 == a2) // compile-time error
        ;// DoSomeThing
    
    上面的错误是因为编译器不知道哪些字段将相互比较。解决方案是重载equals操作符“==”来处理类的对象

    class Student{
        public:
            Student(std::string, int age);
            std::string getName()const;
            int getAge()const;
    
            bool operator == (const Student&);
        private:
            std::string name;
            int age;
    };
    
    Student::Student(std::string str, int x) : 
        name(str), age(x){
    }
    
    bool Student::operator == (const Student& rhs){
        return age == rhs.age;  
    }
    
    std::string Student::getName()const{
        return name;
    }
    
    int Student::getAge()const{
        return age;
    }
    
    
    int main(){
    
    
        Student a("Alpha", 77);
        Student b("Beta", 49);
    
        if(a == b)
            std::cout << a.getName() << " is the same age as " << 
            b.getName() << std::endl;
    
    
        cout << endl << endl;
        return 0;
    }
    
    班级学生{
    公众:
    学生(std::string,int-age);
    std::string getName()常量;
    int getAge()常量;
    布尔运算符==(常量学生&);
    私人:
    std::字符串名;
    智力年龄;
    };
    Student::Student(std::string str,int x):
    姓名(str)、年龄(x){
    }
    布尔学生::运算符==(常量学生和rhs){
    返回年龄==rhs.age;
    }
    std::string Student::getName()常量{
    返回名称;
    }
    int Student::getAge()常量{
    回归年龄;
    }
    int main(){
    学生a(“阿尔法”,77岁);
    学生b(“贝塔”,49岁);
    如果(a==b)
    
    std::你的意思是如何删除向量的元素吗?或者你不知道如何为
    对象
    类实现
    操作符==
    ?我基本上想从列表中删除给定的元素,我认为这是一种正确的方法?如果你
    删除
    基于范围的中的元素,可能值得指出de>对于
    循环,必须
    中断
    ,因为
    std::vector::erase
    会使迭代器无效。最好将比较函数实现为非成员函数,以允许在两侧进行隐式类型转换。
    如果*this等于b,则返回true;
    至少注释掉它。“在大多数情况下,它应该是默认实现的。”不是真的。std中没有接受这些参数的删除函数。有。请看这里的第一个重载: