从类中删除列表元素

时间:2014-05-08 14:31:09

标签: c++ list erase

我尝试删除列表元素并始终收到错误消息。

首先我有这个类结构:

Class X
{ public:
  ID;
  name;
}

然后我有列表容器。

现在,我想从容器中删除特定元素。

void delete ( list<X> a , X b )
{

list<X>::iterator itr;

for ( itr =a.begin() ; itr != a.end() ; itr++ )
{
    if ( *itr.ID == b.ID )
    { a.erase(itr) ; }
}
}

但是,我收到了错误:

  

“迭代器没有ID”。

我该如何解决?

2 个答案:

答案 0 :(得分:1)

这是因为点运算符.更强&#34;而不是取消引用运算符*。根据{{​​3}},dot的优先级为2,而dereference asterisk *的优先级为3(lower更强)。这意味着如果没有括号,编译器会尝试获取迭代器的成员ID,然后取消引用ID的值。这是不可能的,因为迭代器没有名为ID的成员。

您需要添加括号以强制执行所需的优先级:

if ( (*itr).ID == b.ID )

或者,您可以使用->运算符取消引用迭代器:

if ( itr->ID == b.ID )

注意:C ++标准库提供了一种无需循环的方法:

a.erase(
    remove_if(
        a.begin()
    ,   a.end()
    ,   [](X x){ return x.ID == b.ID; }
    )
,   a.end()
);

this table

答案 1 :(得分:0)

我更喜欢使用itr-&gt; ID代替* itr.ID。后来有点混乱。