STL и функция remove_if
От: dima11221122  
Дата: 28.09.10 20:55
Оценка:
#include "stdafx.h"
#include <iostream>
#include <list>
#include <algorithm>
#include <iterator>
.....
struct computer1
{
        int comp_number;
    int comp_mark;
};
 
struct connection1
{
        int side1;
    int side2;
    int conn_mark;
};
 
bool cond_comp(list<computer1>::iterator x)
{
        return (x->comp_mark==1);
}
 
bool cond_conn(list<connection1>::iterator y)
{
        return (y->conn_mark==1);
}
void delete1()
{
        list<computer1>::iterator x;
        x=remove_if(computers.begin(), computers.end(), cond_comp);
        computers.erase(x, computers.end());
 
        list<connection1>::iterator y;
        y=remove_if(connections.begin(), connections.end(), cond_conn);
        connections.erase(y, connections.end());
}


при компиляции указывает на ошибки в библиотеках. текст


c:\program files\microsoft visual studio 9.0\vc\include\algorithm(87) : error C2664: 'bool (std::list<_Ty>::_Iterator<_Secure_validation>)' : cannot convert parameter 1 from 'computer1' to 'std::list<_Ty>::_Iterator<_Secure_validation>'
1> with
1> [
1> _Ty=computer1,
1> _Secure_validation=true
1> ]
1> No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
1> c:\program files\microsoft visual studio 9.0\vc\include\algorithm(96) : see reference to function template instantiation '_InIt std::_Find_if<std::list<_Ty>::_Iterator<_Secure_validation>,bool(__cdecl *)(std::list<_Ty>::_Iterator<true>)>(_InIt,_InIt,_Pr)' being compiled
1> with
1> [
1> _InIt=std::list<computer1>::_Iterator<false>,
1> _Ty=computer1,
1> _Secure_validation=false,
1> _Pr=bool (__cdecl *)(std::list<computer1>::_Iterator<true>)
1> ]
1> c:\program files\microsoft visual studio 9.0\vc\include\algorithm(1305) : see reference to function template instantiation '_InIt std::find_if<_FwdIt,bool(__cdecl *)(std::list<_Ty>::_Iterator<_Secure_validation>)>(_InIt,_InIt,_Pr)' being compiled
1> with
1> [
1> _InIt=std::list<computer1>::_Iterator<true>,
1> _FwdIt=std::list<computer1>::_Iterator<true>,
1> _Ty=computer1,
1> _Secure_validation=true,
1> _Pr=bool (__cdecl *)(std::list<computer1>::_Iterator<true>)
1> ]
1> c:\users\дмитрий\desktop\с\stl_computer_net\stl_computer_net\stl_computer_net.cp p(105) : see reference to function template instantiation '_FwdIt std::remove_if<std::list<_Ty>::_Iterator<_Secure_validation>,bool(__cdecl *)(std::list<_Ty>::_Iterator<_Secure_validation>)>(_FwdIt,_FwdIt,_Pr)' being compiled
1> with
1> [
1> _FwdIt=std::list<computer1>::_Iterator<true>,
1> _Ty=computer1,
1> _Secure_validation=true,
1> _Pr=bool (__cdecl *)(std::list<computer1>::_Iterator<true>)
1> ]
1>c:\program files\microsoft visual studio 9.0\vc\include\algorithm(1241) : error C2664: 'bool (std::list<_Ty>::_Iterator<_Secure_validation>)' : cannot convert parameter 1 from 'computer1' to 'std::list<_Ty>::_Iterator<_Secure_validation>'
1> with
1> [
1> _Ty=computer1,
1> _Secure_validation=true
1> ]
1> No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
1> c:\program files\microsoft visual studio 9.0\vc\include\algorithm(4951) : see reference to function template instantiation '_OutIt std::_Remove_copy_if<std::list<_Ty>::_Iterator<_Secure_validation>,_OutIt,bool(_ _cdecl *)(std::list<_Ty>::_Iterator<true>)>(_InIt,_InIt,_OutIt,_Pr,std::_Range_checked_ iterator_tag)' being compiled
1> with
1> [
1> _OutIt=std::list<computer1>::_Iterator<true>,
1> _Ty=computer1,
1> _Secure_validation=false,
1> _InIt=std::list<computer1>::_Iterator<false>,
1> _Pr=bool (__cdecl *)(std::list<computer1>::_Iterator<true>)
1> ]
1> c:\program files\microsoft visual studio 9.0\vc\include\algorithm(1311) : see reference to function template instantiation '_OutIt stdext::unchecked_remove_copy_if<std::list<_Ty>::_Iterator<_Secure_validation>,_ FwdIt,bool(__cdecl *)(std::list<_Ty>::_Iterator<_Secure_validation>)>(_InIt,_InIt,_OutIt,_Pr)' being compiled
1> with
1> [
1> _OutIt=std::list<computer1>::_Iterator<true>,
1> _Ty=computer1,
1> _Secure_validation=true,
1> _FwdIt=std::list<computer1>::_Iterator<true>,
1> _InIt=std::list<computer1>::_Iterator<true>,
1> _Pr=bool (__cdecl *)(std::list<computer1>::_Iterator<true>)
1> ]
1>c:\program files\microsoft visual studio 9.0\vc\include\algorithm(87) : error C2664: 'bool (std::list<_Ty>::_Iterator<_Secure_validation>)' : cannot convert parameter 1 from 'connection1' to 'std::list<_Ty>::_Iterator<_Secure_validation>'
1> with
1> [
1> _Ty=connection1,
1> _Secure_validation=true
1> ]
1> No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
1> c:\program files\microsoft visual studio 9.0\vc\include\algorithm(96) : see reference to function template instantiation '_InIt std::_Find_if<std::list<_Ty>::_Iterator<_Secure_validation>,bool(__cdecl *)(std::list<_Ty>::_Iterator<true>)>(_InIt,_InIt,_Pr)' being compiled
1> with
1> [
1> _InIt=std::list<connection1>::_Iterator<false>,
1> _Ty=connection1,
1> _Secure_validation=false,
1> _Pr=bool (__cdecl *)(std::list<connection1>::_Iterator<true>)
1> ]
1> c:\program files\microsoft visual studio 9.0\vc\include\algorithm(1305) : see reference to function template instantiation '_InIt std::find_if<_FwdIt,bool(__cdecl *)(std::list<_Ty>::_Iterator<_Secure_validation>)>(_InIt,_InIt,_Pr)' being compiled
1> with
1> [
1> _InIt=std::list<connection1>::_Iterator<true>,
1> _FwdIt=std::list<connection1>::_Iterator<true>,
1> _Ty=connection1,
1> _Secure_validation=true,
1> _Pr=bool (__cdecl *)(std::list<connection1>::_Iterator<true>)
1> ]
1> c:\users\дмитрий\desktop\с\stl_computer_net\stl_computer_net\stl_computer_net.cp p(109) : see reference to function template instantiation '_FwdIt std::remove_if<std::list<_Ty>::_Iterator<_Secure_validation>,bool(__cdecl *)(std::list<_Ty>::_Iterator<_Secure_validation>)>(_FwdIt,_FwdIt,_Pr)' being compiled
1> with
1> [
1> _FwdIt=std::list<connection1>::_Iterator<true>,
1> _Ty=connection1,
1> _Secure_validation=true,
1> _Pr=bool (__cdecl *)(std::list<connection1>::_Iterator<true>)
1> ]
1>c:\program files\microsoft visual studio 9.0\vc\include\algorithm(1241) : error C2664: 'bool (std::list<_Ty>::_Iterator<_Secure_validation>)' : cannot convert parameter 1 from 'connection1' to 'std::list<_Ty>::_Iterator<_Secure_validation>'
1> with
1> [
1> _Ty=connection1,
1> _Secure_validation=true
1> ]
1> No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
1> c:\program files\microsoft visual studio 9.0\vc\include\algorithm(4951) : see reference to function template instantiation '_OutIt std::_Remove_copy_if<std::list<_Ty>::_Iterator<_Secure_validation>,_OutIt,bool(_ _cdecl *)(std::list<_Ty>::_Iterator<true>)>(_InIt,_InIt,_OutIt,_Pr,std::_Range_checked_ iterator_tag)' being compiled
1> with
1> [
1> _OutIt=std::list<connection1>::_Iterator<true>,
1> _Ty=connection1,
1> _Secure_validation=false,
1> _InIt=std::list<connection1>::_Iterator<false>,
1> _Pr=bool (__cdecl *)(std::list<connection1>::_Iterator<true>)
1> ]
1> c:\program files\microsoft visual studio 9.0\vc\include\algorithm(1311) : see reference to function template instantiation '_OutIt stdext::unchecked_remove_copy_if<std::list<_Ty>::_Iterator<_Secure_validation>,_ FwdIt,bool(__cdecl *)(std::list<_Ty>::_Iterator<_Secure_validation>)>(_InIt,_InIt,_OutIt,_Pr)' being compiled
1> with
1> [
1> _OutIt=std::list<connection1>::_Iterator<true>,
1> _Ty=connection1,
1> _Secure_validation=true,
1> _FwdIt=std::list<connection1>::_Iterator<true>,
1> _InIt=std::list<connection1>::_Iterator<true>,
1> _Pr=bool (__cdecl *)(std::list<connection1>::_Iterator<true>)
1> ]
Re: STL и функция remove_if
От: kuzbas22  
Дата: 28.09.10 21:31
Оценка:
Здравствуйте, dima11221122, Вы писали:

D>#include "stdafx.h"

D>#include <iostream>
D>
D>#include <list>
D>#include <algorithm>
D>#include <iterator>
D>.....
D>struct computer1
D>{
D>        int comp_number;
D>    int comp_mark;
D>};
 
D>struct connection1
D>{
D>        int side1;
D>    int side2;
D>    int conn_mark;
D>};
 
D>bool cond_comp(list<computer1>::iterator x)
D>{
D>        return (x->comp_mark==1);
D>}
 
D>bool cond_conn(list<connection1>::iterator y)
D>{
D>        return (y->conn_mark==1);
D>}
D>void delete1()
D>{
D>        list<computer1>::iterator x;
D>        x=remove_if(computers.begin(), computers.end(), cond_comp);
D>        computers.erase(x, computers.end());
 
D>        list<connection1>::iterator y;
D>        y=remove_if(connections.begin(), connections.end(), cond_conn);
D>        connections.erase(y, connections.end());
D>}       
D>


D>при компиляции указывает на ошибки в библиотеках. текст



D>[code]



>>c:\program files\microsoft visual studio 9.0\vc\include\algorithm(87) : error C2664: 'bool (std::list<_Ty>::_Iterator<_Secure_validation>)' : cannot convert parameter 1 from 'computer1' to 'std::list<_Ty>::_Iterator<_Secure_validation>'


Это вам сказано про cond_comp и cond_conn которые вы указываете в качестве параметров шаблонной функции remove_if
Компилятор попытался собрать шаблон с данными параметрами и у него это не получилось о чем он вам и сказал.. (cannot convert parameter 1 from 'computer1' to 'std::list<_Ty>::_Iterator<_Secure_validation>')
т.е. вот это bool cond_comp( list<computer1>::iterator x) нада заменить на это — bool cond_comp(computer1 x)
Кстати в MSDN помоему есть примеры ко всем алгоритмам..
Re: STL и функция remove_if
От: Bell Россия  
Дата: 29.09.10 03:37
Оценка: 1 (1)
Здравствуйте, dima11221122, Вы писали:

Алгоритм передает в функторы не итератор, а результат разыменовывания итератора, поэтому функторы нужно переписать вот так:
bool cond_comp(const computer1& x)
{
        return (x.comp_mark==1);
}
 
bool cond_conn(const connection1& y)
{
        return (y.conn_mark==1);
}
Любите книгу — источник знаний (с) М.Горький
Re: STL и функция remove_if
От: rusted Беларусь  
Дата: 29.09.10 09:44
Оценка:
Здравствуйте, dima11221122, Вы писали:

D>
D>        list<computer1>::iterator x;
D>        x=remove_if(computers.begin(), computers.end(), cond_comp);
D>        computers.erase(x, computers.end());
D>


Плюс ко всему уже сказанному, у list есть свой, более оптимальный вариант remove_if.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.