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*
删除对象的逻辑相同,既然这是允许的,正交性也应该允许。