比较存储在向量中的类对象的私有成员变量 - C ++

时间:2017-01-18 17:40:24

标签: c++ class vector

所以我创建了一个程序,它可以读取大约20行的.dat文件,其中包含有关不同原子(名称,符号,质量等)的信息,并将它们全部添加到名为Atom的类类型I的向量中。

我如何编写函数来查找质量最高的原子?

这是我的班级:

class Atom
{
    string element, symbol;
    float number;
    float mass;
public:
    Atom(string e, string s, float n, float m){
        element = e; symbol = s; number = n; mass = m;
    }
    string getElement();
    string getSymbol();
    float getNumber();
    float getMass();
    float ratio();
    friend ostream& operator<<(ostream& os, Atom c);
};

并将信息添加到带有以下语句的向量

    ifstream fin("atoms.dat");  

    string E, S;
    float M, N;

    vector <Atom> periodic;

    while(!fin.eof()){
        fin >> E >> S >> M >> N;
        Atom Atom(E, S, M, N);
        periodic.push_back(Atom);
    }

我希望能够编写一个找到哪个原子具有最高质量的函数,我尝试过使用max_element函数,但是我一直遇到错误。有没有一种比较存储在向量中的类对象的成员变量的快速方法?

我目前正在使用C ++ 98,因为这是我的课程要求。

由于

3 个答案:

答案 0 :(得分:2)

我不知道你对std::max_element做错了什么,因为你没有提供你尝试过的东西。

struct CompareAtomMass
{
    bool operator()(const Atom& lhs, const Atom& rhs) {
        return lhs.getMass() < rhs.getMass();
    }
};

然后:

vector <Atom> periodic;
Atom max_atom = *max_element(periodic.begin(), periodic.end(), CompareAtomMax());

struct CompareAtomMass被称为函数对象。这是一个operator()重载的类,可以返回boolstd::max_element只需要这样的函数对象来吐出max元素,因为它需要一种比较Atom的方法。

修改 您应该将getter函数标记为const,因为它们不会更改类的内部状态。

string getElement() const;
string getSymbol() const;
float getNumber() const;
float getMass() const;

这将允许您从类型为const的{​​{1}}对象中调用它们,就像上面的函数对象需要(Atom)一样。

答案 1 :(得分:0)

DeiDeis的变化回答:如果你只在一个地方这样做,并且不需要保留CompareAtomMass函数类,你可以使用lambda:

auto

在C ++ 14及更高版本中,你也可以在lambdas中使用const auto maxIt = max_element(periodic.begin(), periodic.end(), [](const auto& lhs, const auto& rhs) { return lhs.getMass() < rhs.getMass(); ));

private Dictionary<string: Area, Dictionary<string: Controller, string: Action>> ActionCollection;

答案 2 :(得分:0)

最好让您的会员功能const。 这将允许此代码。否则,只需从我的代码中删除所有const。 如果你的向量是空的,你将得到空指针。

struct AtomMassComparator
{
    bool operator()(const Atom& lhs, const Atom& rhs)
    {
        return lhs.getMass() < rhs.getMass();
    }
};

const Atom* getAtomWithHighestMass(const vector<Atom>& v)
{
    vector<Atom>::const_iterator it = max_element(
        v.begin(), v.end(), AtomMassComparator());
    return v.end() == it ? 0 : &*it;
}