所以我创建了一个程序,它可以读取大约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,因为这是我的课程要求。
由于
答案 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()
重载的类,可以返回bool
。 std::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;
}