C++ c、 擦除(p)can';无法成功编译,为什么?

C++ c、 擦除(p)can';无法成功编译,为什么?,c++,C++,我曾尝试在列表中测试擦除功能,但没有成功!我的编译器的错误消息是: [Error]error: no matching function for call to `std::list<int,std::allocator<int> >::erase(std::_List_const_iterator<int>&)'. [Error]错误:没有用于调用的匹配函数 `std::list::erase(std:_list_const_iterator&')

我曾尝试在列表中测试擦除功能,但没有成功!我的编译器的错误消息是:

[Error]error: no matching function for call to
`std::list<int,std::allocator<int> >::erase(std::_List_const_iterator<int>&)'.
[Error]错误:没有用于调用的匹配函数
`std::list::erase(std:_list_const_iterator&')。
我的代码如下:

#include <iostream>
#include <list>
using namespace std;

int main()
{
    int ia[] = {0, 1, 1, 2, 3, 5, 8, 13, 21, 55, 89};
    list<int> ilst(ia, ia + 11);

    list<int>::const_iterator iter2 = ilst.begin();
    for(; iter2 != ilst.end(); ++iter2)
    {
        if(*iter2 % 2 != 0)
        {   
            iter2 = ilst.erase(iter2);  //error!
            --iter2;
        }
    }
    iter2 = ilst.begin();   
    for(; iter2 != ilst.end(); ++iter2)
    {
        cout << *iter << " ";
    }   
    cout << endl;
}
#包括
#包括
使用名称空间std;
int main()
{
INTIA[]={0,1,1,2,3,5,8,13,21,55,89};
列表ilst(ia,ia+11);
list::const_迭代器iter2=ilst.begin();
对于(;iter2!=ilst.end();++iter2)
{
如果(*iter2%2!=0)
{   
iter2=ilst.erase(iter2);//错误!
--iter2;
}
}
iter2=ilst.begin();
对于(;iter2!=ilst.end();++iter2)
{

cout看看这个示例,我认为您可以毫不费力地切换到list::iterator而不是list::const_iterator。 以这种方式编译的代码没有错误

您还可以使用:

list<int>::iterator new_end = 
        remove_if(ilst.begin(), ilst.end(), 
                  compose1(bind2nd(equal_to<int>(), 0),
                           bind2nd(modulus<int>(), 2)));
ilst.erase(new_end, ilst.end());
copy(ilst.begin(), ilst.end(), ostream_iterator<int>(cout, " "));
list::迭代器新建\u end=
如果(ilst.begin(),ilst.end(),则删除,
组合1(bind2nd(等于(),0),
bind2nd(模量(),2));
ilst.erase(new_end,ilst.end());
复制(ilst.begin(),ilst.end(),ostream_迭代器(cout,“”);

代码实际上很难闻。可能在删除iter2后,它指的是列表的开头(如果您碰巧删除了第一项),在这种情况下,您不应该将其递减

循环中正确的擦除形式如下所示:

for(list<int>::iterator iter2 = ilst.begin(); iter2 != ilst.end(); )
{
    if(*iter2 % 2 != 0)
    {       
        iter2 = ilst.erase(iter2);      //no error, if not using const_iterator
    }
    else {
        ++iter2; //only increment if didn't erase
    }
}
(列表::迭代器iter2=ilst.begin();iter2!=ilst.end();) { 如果(*iter2%2!=0) { iter2=ilst.erase(iter2);//如果不使用常量迭代器,则无错误 } 否则{ ++iter2;//仅当未擦除时递增 } }
如果像TimW一样,我也建议使用remove_,除非可以使用成员函数而不是自由函数(如std::list),而且我认为compose1不在标准库中(尚未?)。关于第二点,幸运的是,在这种情况下,它不需要那么复杂:

ilst.remove_if(bind2nd(modulus<int>(), 2));
ilst.remove_if(bind2nd(模数(),2));

+1.尝试使用常量迭代器背后的逻辑是什么。常量迭代器“不能用来修改元素的值”。我想说删除元素就是修改它的值……与通过
常量T*
删除对象的逻辑相同,既然这是允许的,正交性也应该允许。