删除成语c ++(没有朋友功能)

时间:2018-02-25 20:35:57

标签: c++

我有两个班级:

#include <iostream>
#include <vector>
#include <string>
#include <stdexcept>
#include <algorithm>
#include <cmath>
#include <list>
using namespace std;

enum class Programm{Koch, Normal, Bunt, Fein};

class KleidSt {
private:
    string bezeichnung;
    int gewicht;
    Programm Pflegehinweis;

public:
    KleidSt(string bezeichnung, int gewicht);
    KleidSt(string bezeichnung, int gewicht, Programm Pflegehinweis);
    int get_gewicht() const;
    bool vertraeglich(Programm)const;
    int get_Pflegehinweis() const;
    friend ostream& operator<<(ostream& os, const KleidSt& kleid);
};


class WaschM{
private:
    int ladungsgewicht;
    vector<KleidSt> wasch;
public:
    WaschM(int ladungsgewicht);
    void zuladen(const vector<KleidSt>& z);
    void waschen(Programm);
    friend ostream& operator<<(ostream& os, const WaschM& kleid);
    int programme() const;
    vector<KleidSt> aussortieren(Programm pr);
};

我想创建函数vector<KleidSt> aussortieren(Programm),如果这些元素的wasch属性更高(使用Pflegehinweis函数),则会删除static_cast<int>(elem)向量中的所有元素然后由aussortieren函数定义,并返回已删除元素的向量。

我的第一次尝试是使用Erase-remove idiom:

vector<KleidSt> WaschM::aussortieren(Programm pr){
    wasch.erase(remove_if(begin(wasch), end(wasch), vertraeglich(pr)), end(wasch));
    return wasch;
}

这里vertraeglich(pr)完成了我上面描述的工作。 但它显然会返回错误,因为vertraeglich函数是在类WaschM的范围之外定义的。问题是:我如何使用Erase-remove成语(或者其他一些变体),这样代码才有用?

2 个答案:

答案 0 :(得分:3)

看起来像是lambda函数的作业

vector<KleidSt> WaschM::aussortieren(Programm pr){
    wasch.erase(
        remove_if(
            begin(wasch),
            end(wasch), 
            [&](const KleidSt& k){ return k.vertraeglich(pr); }), 
        end(wasch));
    return wasch;
}

未经测试的代码。

答案 1 :(得分:2)

您可以使用lambda函数。

vector<KleidSt> WaschM::aussortieren(Programm pr){
    wasch.erase(remove_if(begin(wasch),
                          end(wasch),
                          [pr](KleidSt const& item) {return item.vertraeglich(pr);},
                          end(wasch));
    return wasch;
}