The example below shows the minimal use of OEChem's iterators. These
examples use the OEMolBase methods GetAtoms
and GetBonds
,
which return iterators over the atoms and bonds of a molecule,
respectively.
#include "oechem.h" #include <iostream> using namespace OESystem; using namespace OEChem; using namespace std; bool MyMolIsEmpty(OEMolBase &mol) { return mol.GetAtoms()? false : true; } unsigned int MyNumAtoms(OEMolBase &mol) { OEIter<OEAtomBase> atom; unsigned int result = 0; for (atom = mol.GetAtoms(); atom; ++atom) ++result; return result; } unsigned int MyNumBonds(OEMolBase &mol) { OEIter<OEBondBase> bond; unsigned int result = 0; for (bond = mol.GetBonds(); bond; ++bond) ++result; return result; } int main() { OEMol mol; OEParseSmiles(mol, "c1ccccc1"); if (!MyMolIsEmpty(mol)) { cerr << "num atoms: " << MyNumAtoms(mol) << endl; cerr << "num bonds: " << MyNumBonds(mol) << endl; } return 0; }
The user function MyMolIsEmpty returns true if the input molecule has no atoms, and the functions MyNumAtoms and MyNumBonds count the number of atoms and bonds in a molecule using OEChem's iterators. These ``My*'' functions are just for demonstration, it is far more efficient to use the OEMolBase's NumAtoms and NumBonds methods in production code.
One point to notice is that once again C++'s destructors mean that it is not necessary to explicitly deallocate or destroy the iterator after use. Once the variable goes out of scope, it is cleaned up automatically.