我尝试删除列表元素并始终收到错误消息。
首先我有这个类结构:
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”。
我该如何解决?
答案 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()
);
答案 1 :(得分:0)
我更喜欢使用itr-&gt; ID代替* itr.ID。后来有点混乱。