Re: STL vector iterator question
On Sep 4, 9:43 pm, "T. Crane" <trevis.cr...@gmail.com> wrote:
I have some data that I am using a vector<vector<double> > container
to hold. The data is n sets of (x,y,z,intensity) data points. I can
either group my data like this:
vector<vector<double> > v(n, vector<double>(4)); // method A
or like this:
vector<vector<double> > v(4, vector<double>(n)); // method B
This difference, of course, is that in the first method, I have n 4-
element vectors and in the second I have 4 n-element vectors.
Off hand, something like:
struct DataPoint
{
double x ;
double y ;
double z ;
// or maybe: double pos[3] ;
// instead of x, y and z.
double intensity ;
} ;
std::vector< DataPoint > v( n ) ;
would seem more natural. If you can name the individual
elements in a semantically significant manner, it's usually best
to do so.
For small arrays which *must* have a fixed size for the program
to work, C style arrays are often preferable to std::vector.
But I would never use them for this outside of a wrapping struct
or class, since they don't have correct value semantics (which
you definitely need here, and would logically expect elsewhere).
The fact that intensity has a very distinct semantic from the
other elements (which I suppose are a position) means that it
should in no case be an element of the array, however.
Next, I want to find the (x,y,z) coordinates of the point that has the
highest intensity. Finding the highest intensity is easy when I use
method B to group the data.
All I have to do is:
vector<double>::iterator maxInt = max_element(v[3].begin(),
v[3].end());
The max intensity is found by dereferencing maxInt. However, at this
point I'm at a loss as to how to get the corresponding (x,y,z) values
for that max intensity.
Alternatively, if I were to group the data using method A, once I have
a max intensity, it's trivial to find the (x,y,z) values, but I don't
know a good (i.e. easy, elegant, whatever) way to find the max
intensity short of writing a max_element-like function.
What's wrong with the above structure, using something like:
struct CompareIntensities
{
bool operator()(
DataPoint const& lhs,
DataPoint const& rhs ) const
{
return lhs.intensity < rhs.intensity ;
}
} ;
then
std::vector< DataPoint >::iterator
maxInt
= std::max_element( v.begin(), v.end(),
CompareIntensities() ) ;
If you never compare anything but the intensities, you can also
define an operator< for DataPoint which only considers the
intensities. (I rather prefer the named comparison, however, as
it also documents exactly which criterion is being used for the
comparison.)
--
James Kanze (GABI Software) email:james.ka...@gmail.com
Conseils en informatique orient=E9e objet/
Beratung in objektorientierter Datenverarbeitung
9 place S=E9mard, 78210 St.-Cyr-l'=C9cole, France, +33 (0)1 30 23 00 34