如何从具有用户定义数据类型的列表中删除元素? [英] How to remove an element from list having user defined data type?

查看:133
本文介绍了如何从具有用户定义数据类型的列表中删除元素?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

大家好,
我试图从为用户定义的数据类型创建的C ++列表中删除一个元素.由于模板未知用户定义类型上的==运算符,因此会引发错误.我该如何克服这个问题?

Hi all,
I am trying to remove an element from C++ list created for user defined data type. It is throwing error since == operator on a user defined type is unknown to template. How do I overcome this problem?

#include <iostream>
#include <list>

using namespace std;

 struct mem_list
    {
        unsigned int addr;
        int size;
    };


int main()
{

    list<mem_list> Mem_numbers;
    mem_list mem;
    mem_list *ptr_mem;
    mem.addr = 0xFF;
    mem.size = 10;

    Mem_numbers.push_front(mem);

    mem.addr = 0xAA;
    mem.size = 20;

    Mem_numbers.push_front(mem);


    mem.addr = 0xBB;
    mem.size = 30;

    Mem_numbers.push_front(mem);


    mem.addr = 0xCC;
    mem.size = 40;

    Mem_numbers.push_front(mem);


    mem.addr = 0xDD;
    mem.size = 50;

    Mem_numbers.push_front(mem);

    int counter = 0;

    for(list<mem_list>::const_iterator it = Mem_numbers.begin(); it != Mem_numbers.end(); ++it)
    {
        mem = *it;
        cout << mem.size<< " ";
    }

    cout << endl;

    for(list<mem_list>::const_iterator it = Mem_numbers.begin(); it != Mem_numbers.end(); ++it)
    {

            mem = *it;

            if( mem.size == 30)
            {
                Mem_numbers.remove(mem);
            }
    }


    for(list<mem_list>::const_iterator it = Mem_numbers.begin(); it != Mem_numbers.end(); ++it)
    {

            mem = *it;
            cout << mem.size<< " ";

    }

    cout << endl;

    return 0;
}

推荐答案

函数
std::list<t>::remove(const T&)</t>

在列表中搜索等于要传递的值的元素.为了测试相等性,它调用运算符

searches the list for an element that is equal to the value being passed. To test equality, it invokes the operator

bool operator==(const T& v1, const T& v2)

或替代地,运算符

bool T::operator==(const T& v) const


对于诸如int之类的内置类型,隐式定义了第一类运算符.但是对于用户定义的类型则不是.因此,您必须自己定义此运算符的两种形式之一:


For built-in types such as int, the first type of operator is implicitely defined. For user-defined types however it is not. Therefore you must define one of the two forms of this operator yourself:

bool operator==(const mem_list& v1, const mem_list& v2) {
   return v1.addr==v2.addr && v1.size==v2.size;
}
// or:
struct mem_list {
   unsigned int addr;
   int size;
   bool operator==(const struct mem_size& v) const {
      return v.size==size && v.addr==addr;
   }
};(



std::list元素必须必须具有等价性.将operator == ()添加到您的struct mem_list中,例如:
Hi,
std::list elements must be equality comparable. Add an operator == () to your struct mem_list like:
struct mem_list
{
    bool operator == (const mem_list& other)
    {
        return (addr == other.addr) && (size == other.size);
    }
    unsigned int addr;
    int size;
};


欢呼声,
AR
编辑(希望)正确答案


cheers,
AR
Edited for (hopefully) correct answer


这篇关于如何从具有用户定义数据类型的列表中删除元素?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆