Go back to Richel Bilderbeek's homepage.

Go back to Richel Bilderbeek's C++ page.

 

 

 

 

 

(C++) MaxElement

 

Container code snippet similar to std::max_element, but that works on 2D containers instead.

 

#include <vector>
#include <cassert>
#include <algorithm>

//Obtains the maximal element of a 2D container
//From http://www.richelbilderbeek.nl/CppMaxElement.htm
double MaxElement(const std::vector<std::vector<double> >& v)
{
  assert(v.empty() == false && "Container must have a size");

  //Obtain an initial lowest value
  double maxValue = *(std::max_element(v[0].begin(),v[0].end()));

  //Set the iterators
  const std::vector<std::vector<double> >::const_iterator rowEnd = v.end();
  std::vector<std::vector<double> >::const_iterator row = v.begin();
  ++row; //Move to the next position, as index 0 is already read from

  for ( ; row != rowEnd; ++row) //row is already initialized
  {
    const std::vector<double>::value_type localMaxVal
      = *(std::max_element(row->begin(),row->end()));
    if (localMaxVal > maxValue) maxValue = localMaxVal;
  }
  return maxValue;
}

 

 

 

 

 

MaxElement test

 

#include <vector>

//From http://www.richelbilderbeek.nl/CppGetSizes.htm
const std::vector<std::size_t> GetSizes(const std::vector<std::vector<double> >& v)
{
  std::vector<std::size_t> w;

  const std::size_t sz = v.size();
  for (std::size_t i = 0; i!=sz; ++i)
  {
    w.push_back(v[i].size());
  }
  return w;
}

#include <cassert>
#include <algorithm>

//Obtains the maximal element of a 2D container
//From http://www.richelbilderbeek.nl/CppMaxElement.htm
double MaxElement(const std::vector<std::vector<double> >& v)
{
  assert(v.empty() == false && "Container must have a size");

  //Obtain an initial lowest value
  double maxValue = *(std::max_element(v[0].begin(),v[0].end()));

  //Set the iterators
  const std::vector<std::vector<double> >::const_iterator rowEnd = v.end();
  std::vector<std::vector<double> >::const_iterator row = v.begin();
  ++row; //Move to the next position, as index 0 is already read from

  for ( ; row != rowEnd; ++row) //row is already initialized
  {
    const std::vector<double>::value_type localMaxVal
      = *(std::max_element(row->begin(),row->end()));
    if (localMaxVal > maxValue) maxValue = localMaxVal;
  }
  return maxValue;
}

//From htpp://www.richelbilderbeek.nl/CppGetRandomUniform.htm
double GetRandomUniform()
{
  return static_cast<double>(std::rand())/static_cast<double>(RAND_MAX);
}

#include <iterator>
#include <iostream>

//Tests the function MaxElement and GetSizes
//From http://www.richelbilderbeek.nl/CppMaxElement.htm
int main()
{
  std::vector<std::vector<double> > v;
  for (int i=0; i!=10; ++i)
  {
    {
      std::cout << "vector sizes: ";
      const std::vector<std::size_t> sizes = GetSizes(v);
      std::copy(sizes.begin(),sizes.end(),std::ostream_iterator<std::size_t>(std::cout," "));
      std::cout << std::endl;
    }
    //Add random values to all rows
    for (std::size_t j = 0; j!=v.size(); ++j)
    {
      const double x = GetRandomUniform();
      v[j].push_back(x);
      std::cout << "New value: " << x << ", new heighest value: " << MaxElement(v) << std::endl;
    }
    //Add one row with one random value
    {
      const double x = GetRandomUniform();
      v.push_back(std::vector<double>(1,x));
      std::cout << "New value: " << x << ", new heighest value: " << MaxElement(v) << std::endl;
    }
  }
}

 

Screen output:

 

Starting /MyFolder/MyProject...
vector sizes:
New value: 0.840188, new heighest value: 0.840188
vector sizes: 1
New value: 0.394383, new heighest value: 0.840188
New value: 0.783099, new heighest value: 0.840188
vector sizes: 2 1
New value: 0.79844, new heighest value: 0.840188
New value: 0.911647, new heighest value: 0.911647
New value: 0.197551, new heighest value: 0.911647
vector sizes: 3 2 1
New value: 0.335223, new heighest value: 0.911647
New value: 0.76823, new heighest value: 0.911647
New value: 0.277775, new heighest value: 0.911647
New value: 0.55397, new heighest value: 0.911647
vector sizes: 4 3 2 1
New value: 0.477397, new heighest value: 0.911647
New value: 0.628871, new heighest value: 0.911647
New value: 0.364784, new heighest value: 0.911647
New value: 0.513401, new heighest value: 0.911647
New value: 0.95223, new heighest value: 0.95223
vector sizes: 5 4 3 2 1
New value: 0.916195, new heighest value: 0.95223
New value: 0.635712, new heighest value: 0.95223
New value: 0.717297, new heighest value: 0.95223
New value: 0.141603, new heighest value: 0.95223
New value: 0.606969, new heighest value: 0.95223
New value: 0.0163006, new heighest value: 0.95223
vector sizes: 6 5 4 3 2 1
New value: 0.242887, new heighest value: 0.95223
New value: 0.137232, new heighest value: 0.95223
New value: 0.804177, new heighest value: 0.95223
New value: 0.156679, new heighest value: 0.95223
New value: 0.400944, new heighest value: 0.95223
New value: 0.12979, new heighest value: 0.95223
New value: 0.108809, new heighest value: 0.95223
vector sizes: 7 6 5 4 3 2 1
New value: 0.998925, new heighest value: 0.998925
New value: 0.218257, new heighest value: 0.998925
New value: 0.512932, new heighest value: 0.998925
New value: 0.839112, new heighest value: 0.998925
New value: 0.61264, new heighest value: 0.998925
New value: 0.296032, new heighest value: 0.998925
New value: 0.637552, new heighest value: 0.998925
New value: 0.524287, new heighest value: 0.998925
vector sizes: 8 7 6 5 4 3 2 1
New value: 0.493583, new heighest value: 0.998925
New value: 0.972775, new heighest value: 0.998925
New value: 0.292517, new heighest value: 0.998925
New value: 0.771358, new heighest value: 0.998925
New value: 0.526745, new heighest value: 0.998925
New value: 0.769914, new heighest value: 0.998925
New value: 0.400229, new heighest value: 0.998925
New value: 0.891529, new heighest value: 0.998925
New value: 0.283315, new heighest value: 0.998925
vector sizes: 9 8 7 6 5 4 3 2 1
New value: 0.352458, new heighest value: 0.998925
New value: 0.807725, new heighest value: 0.998925
New value: 0.919026, new heighest value: 0.998925
New value: 0.0697553, new heighest value: 0.998925
New value: 0.949327, new heighest value: 0.998925
New value: 0.525995, new heighest value: 0.998925
New value: 0.0860558, new heighest value: 0.998925
New value: 0.192214, new heighest value: 0.998925
New value: 0.663227, new heighest value: 0.998925
New value: 0.890233, new heighest value: 0.998925
/MyFolder/MyProject exited with code 0

 

 

 

 

 

Go back to Richel Bilderbeek's C++ page.

Go back to Richel Bilderbeek's homepage.

 

Valid XHTML 1.0 Strict