Go back to Richel Bilderbeek's homepage.

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

 

 

 

 

 

(C++) MinElement

 

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

 

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

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

  //Obtain an initial lowest value
  double minValue = *(std::min_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 localMinVal
      = *(std::min_element(row->begin(),row->end()));
    if (localMinVal < minValue) minValue = localMinVal;
  }
  return minValue;
}

 

 

 

 

 

General version of MinElement

 

When using the C++ Builder 6.0 IDE the code compiles without problems.

When using the Qt Creator 1.3.1 IDE the code below results in the compile error 'Container::value_type' is not a type.

 

#include <algorithm>
#include <cassert>

//Obtains the minimum element of a 2D container
//From http://www.richelbilderbeek.nl/CppMinElement.htm
template <class Container>
const Container::value_type::value_type MinElement(const Container& v)
{
  assert(v.empty() == false && "Container must have a size");

  //Obtain an initial lowest value
  Container::value_type::value_type minValue
    = *(std::min_element;(v[0].begin(),v[0].end()));

  //Set the iterators
  const Container::const_iterator rowEnd = v.end();
  Container::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 Container::value_type::value_type localMinVal
      = *(std::min_element;(row->begin(),row->end()));
    if (localMinVal < minValue) minValue = localMinVal;
  }
  return minValue;
}

 

 

 

 

 

MinElement 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 minimum element of a 2D container
//From http://www.richelbilderbeek.nl/CppMinElement.htm
double MinElement(const std::vector<std::vector<double> >& v)
{
  assert(v.empty() == false && "Container must have a size");

  //Obtain an initial lowest value
  double minValue = *(std::min_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 localMinVal
      = *(std::min_element;(row->begin(),row->end()));
    if (localMinVal < minValue) minValue = localMinVal;
  }
  return minValue;
}

//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 MinElement and GetSizes
//From http://www.richelbilderbeek.nl/CppMinElement.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 lowest value: " << MinElement(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 lowest value: " << MinElement(v) << std::endl;
    }
  }
}

 

Screen output:

 

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