Лямбда-выражения с++
Дима Ветров

Как с помощьюлямбда выражений найти изолированную вершину графа? Объясните кто-нибудь,пожалуйста. Я хочу с помощбю class IsNotAnyVertex найти изолированную вершину в main.Вот код

// Граф задан набором дуг (неориентированных) и набором вершин.
Найти все изолированные вершины, т.е. вершины, из которых не исходит ни одной дуги.

include <string>

include <map>

include <vector>

include <iostream>

include <ostream>

include <fstream>

include <iterator>

include <algorithm>

pragma hdrstop

using namespace std;

struct KVertex
{
int Num;
KVertex() :Num(-1){}
explicit KVertex(int aNum) :Num(aNum){}

friend istream &operator>>(istream& is, KVertex & vx)
{
    return is >> vx.Num;
}

friend ostream & operator<<(ostream& os, KVertex const& vx)
{
    return os << "(" << vx.Num << ")";
}

};

struct KEdge
{
int NumBeg;
int NumEnd;
KEdge() :NumBeg(0), NumEnd(0){}
KEdge(int aNumBeg, int aNumEnd) :NumBeg(aNumBeg), NumEnd(aNumEnd){}

bool operator ==(KEdge const & e2) const
{
    return (NumBeg == e2.NumBeg && NumEnd == e2.NumEnd);
}
friend istream& operator>>(istream& is, KEdge& ed)
{
    return is >> ed.NumBeg >> ed.NumEnd;

}
friend ostream& operator<<(ostream& os, KEdge const& ed)
{
    return os << "(" << ed.NumBeg << "," << ed.NumEnd << ")";
}

};

/class IsNotAnyVertex :public unary_function < KVertex const&, bool >
{
public:
IsNotAnyVertex(vector<KVertex> const& v) :v(v){}
bool operator()() const
{
???????????????????????
}
private:
vector<KVertex> const& v;
};
/

class IsNotAnyEdges : public unary_function<KEdge const&, bool>
{
public:
IsNotAnyEdges(vector<KEdge> const& ve_) : ve(ve_) { }
bool operator () (KEdge const& e) const
{
return find_if(ve.begin(), ve.end(),[&e](KEdge const& x) { return (x.NumBeg == e.NumBeg || x.NumBeg == e.NumEnd) && !(x == e); }
) == ve.end();
} // = true, если e исходит из дуги x
private:
vector<KEdge> const& ve;
};

int main()
{
setlocale(LC_ALL, "Russian");
vector<KVertex> vv;
vector<KEdge> ve;

typedef istream_iterator<KVertex> is_iterVert;
typedef istream_iterator<KEdge> is_iterKEDge;

typedef vector<KEdge>::iterator iterator;

ifstream fi("inv.txt");
ofstream fo("outv.txt");

if (fi)
{
    copy(is_iterVert(fi), is_iterVert(), back_inserter(vv));
    fo << "Список вершин: ";
    copy(vv.begin(), vv.end(), ostream_iterator<KVertex>(fo, " "));
}
else cout << "Файл inv.txt не открыт" << endl;
fo << endl;

ifstream fi_e("ine.txt");
if (fi_e)
{
    copy(is_iterKEDge(fi_e), is_iterKEDge(), back_inserter(ve));
    fo << "Cписок ребер: ";
    copy(ve.begin(), ve.end(), ostream_iterator<KEdge>(fo, " "));
}
else cout << "Файл ine.txt не открыт" << endl;
fo << endl;



fo << "Упорядочиваем дуги по начальной вершине:" << endl;
auto IsLessEdge1 = [](KEdge const& e1, KEdge const& e2) { return e1.NumBeg < e2.NumBeg; };
sort(ve.begin(), ve.end(), [](KEdge const& e1, KEdge const& e2) { return e1.NumBeg < e2.NumBeg; });
copy(ve.begin(), ve.end(), ostream_iterator<KEdge>(fo, " "));
fo << endl;

typedef vector<KEdge>::iterator iterEdges;
fo << "Список дуг, из вершин которых не исходит ни одной дуги." << endl;
iterEdges itMiddle = partition(ve.begin(), ve.end(), IsNotAnyEdges(ve));
copy(ve.begin(), itMiddle, ostream_iterator<KEdge>(fo, " "));
fo << endl;

/*typedef vector <KVertex>::iterator iterVert;
KVertex ex(5);
vector<KVertex> vex(vv);
fo << "Список вершин из которых не выходит ни одной дуги:" << endl;
iterVert itCom = partition(vv.begin(), vv.end(), IsNotAnyVertex(vv));
    copy(vv.begin(), itCom, ostream_iterator<KVertex>(fo, " "));
    fo << endl;*/

system("pause");
return 0;
Дима Ветров 11 месяцев назадСпасибо 0
3 чел.