Is there a min function that accepts any number of arguments?

Discussion in 'C++' started by Peng Yu, Sep 3, 2008.

  1. Peng Yu

    Peng Yu Guest

    Hi,

    I'm wondering if there is a min function (in boost, maybe?) that
    accepts any number of arguments? std::min only accepts two arguments.
    If I want to get the minimum number out of many, I have use std::min
    many times, which is not convenient.

    Thanks,
    Peng
     
    Peng Yu, Sep 3, 2008
    #1
    1. Advertising

  2. Peng Yu

    Leandro Melo Guest

    On 3 set, 16:33, Peng Yu <> wrote:
    > Hi,
    >
    > I'm wondering if there is a min function (in boost, maybe?) that
    > accepts any number of arguments? std::min only accepts two arguments.
    > If I want to get the minimum number out of many, I have use std::min
    > many times, which is not convenient.


    Hi.

    Maybe, you could iterate through the elements with a for (or something
    similar) keeping track of the smallest element. This is pretty simple.


    --
    Leandro T. C. Melo
     
    Leandro Melo, Sep 3, 2008
    #2
    1. Advertising

  3. Peng Yu

    Peng Yu Guest

    On Sep 3, 2:40 pm, Leandro Melo <> wrote:
    > On 3 set, 16:33, Peng Yu <> wrote:
    >
    > > Hi,

    >
    > > I'm wondering if there is a min function (in boost, maybe?) that
    > > accepts any number of arguments? std::min only accepts two arguments.
    > > If I want to get the minimum number out of many, I have use std::min
    > > many times, which is not convenient.

    >
    > Hi.
    >
    > Maybe, you could iterate through the elements with a for (or something
    > similar) keeping track of the smallest element. This is pretty simple.


    Hi,

    The numbers are at compile time not at runtime time. It has to some
    how use the template to implement such a function.

    Thanks,
    Peng
     
    Peng Yu, Sep 3, 2008
    #3
  4. Peng Yu

    Peng Yu Guest

    On Sep 3, 2:49 pm, Victor Bazarov <> wrote:
    > Peng Yu wrote:
    > > On Sep 3, 2:40 pm, Leandro Melo <> wrote:
    > >> On 3 set, 16:33, Peng Yu <> wrote:

    >
    > >>> Hi,
    > >>> I'm wondering if there is a min function (in boost, maybe?) that
    > >>> accepts any number of arguments? std::min only accepts two arguments.
    > >>> If I want to get the minimum number out of many, I have use std::min
    > >>> many times, which is not convenient.
    > >> Hi.

    >
    > >> Maybe, you could iterate through the elements with a for (or something
    > >> similar) keeping track of the smallest element. This is pretty simple.

    >
    > > Hi,

    >
    > > The numbers are at compile time not at runtime time. It has to some
    > > how use the template to implement such a function.

    >
    > How many numbers are we talking about? You can roll your own 'min_of'
    > implementation using recursive template definitions in no time, can't you?
    >
    > template<class T> T min_of(T t1, T t2) {
    > return std::min(t1, t2);}
    >
    > template<class T> T
    > min_of(T t1, T t2, T t3) {
    > return std::min(min_of(t1, t2), t3);}
    >
    > template<class T> T
    > min_of(T t1, T t2, T t3, T t4) {
    > return std::min(min_of(t1, t2, t3), t4);}
    >
    > template<class T> T
    > min_of(T t1, T t2, T t3, T t4, T t5) {
    > return std::min(min_of(t1, t2, t3, t4), t5);}
    >
    > ... and so on


    Hi Victor,

    I can define my own version of min_of. But I feel that the min
    function that accepts any number of arguments is a reasonable
    extension to std::min, and boost in many ways extends the original C++
    library. I think that it is worthwhile to add such function in boost
    if it is not there. At this point, since the issue is with boost,
    maybe I should post the message at boost mailing list.

    Thanks,
    Peng
     
    Peng Yu, Sep 3, 2008
    #4
  5. Peng Yu wrote:
    > I'm wondering if there is a min function (in boost, maybe?) that
    > accepts any number of arguments? std::min only accepts two arguments.
    > If I want to get the minimum number out of many, I have use std::min
    > many times, which is not convenient.


    With the current C++ I think it's rather difficult to implement such a
    function which takes a variable number of arguments (while probably
    possible, it won't be type-safe, and you would probably have to specify
    explicitly the number of variables as a parameter, making it more
    cumbersome).

    However, AFAIK, with the upcoming standard C++ it will be possible to
    create such a function in a completely type-safe way (and without having
    to specify the number of arguments explicitly), by using so-called
    variadic templates. However, this is not yet standardized.
     
    Juha Nieminen, Sep 3, 2008
    #5
  6. Peng Yu

    Leandro Melo Guest

    On 3 set, 17:04, Juha Nieminen <> wrote:
    > Peng Yu wrote:
    > > I'm wondering if there is a min function (in boost, maybe?) that
    > > accepts any number of arguments? std::min only accepts two arguments.
    > > If I want to get the minimum number out of many, I have use std::min
    > > many times, which is not convenient.

    >
    >   With the current C++ I think it's rather difficult to implement such a
    > function which takes a variable number of arguments (while probably
    > possible, it won't be type-safe, and you would probably have to specify
    > explicitly the number of variables as a parameter, making it more
    > cumbersome).
    >
    >   However, AFAIK, with the upcoming standard C++ it will be possible to
    > create such a function in a completely type-safe way (and without having
    > to specify the number of arguments explicitly), by using so-called
    > variadic templates. However, this is not yet standardized.



    GCC has some implementations already. (Using flag -std=c++0x.)

    --
    Leandro T. C. Melo.
     
    Leandro Melo, Sep 3, 2008
    #6
  7. Peng Yu

    Peng Yu Guest

    On Sep 3, 7:21 pm, "Daniel T." <> wrote:
    > Peng Yu <> wrote:
    > > I'm wondering if there is a min function (in boost, maybe?) that
    > > accepts any number of arguments? std::min only accepts two arguments.
    > > If I want to get the minimum number out of many, I have use std::min
    > > many times, which is not convenient.

    >
    > Yes there is.
    >
    > void fn( const vector<int>& vec )
    > {
    > if ( !vec.empty() ) {
    > int m = *min_element( vec.begin(), vec.end() );
    > // m now equals the minimum value of the vector
    > // so use it
    > cout << "minimum value == " << m << '\n';
    > }
    >
    > }


    Hi,

    It seems that many people misunderstood my original post. What I'm
    looking for is of the syntax,

    min(x1, x2, x3, x4, ..., x_n); // where n can be any number.

    Thanks,
    Peng
     
    Peng Yu, Sep 4, 2008
    #7
  8. Peng Yu a écrit :
    > On Sep 3, 7:21 pm, "Daniel T." <> wrote:
    >> Peng Yu <> wrote:
    >>> I'm wondering if there is a min function (in boost, maybe?) that
    >>> accepts any number of arguments? std::min only accepts two arguments.
    >>> If I want to get the minimum number out of many, I have use std::min
    >>> many times, which is not convenient.

    >> Yes there is.
    >>
    >> void fn( const vector<int>& vec )
    >> {
    >> if ( !vec.empty() ) {
    >> int m = *min_element( vec.begin(), vec.end() );
    >> // m now equals the minimum value of the vector
    >> // so use it
    >> cout << "minimum value == " << m << '\n';
    >> }
    >>
    >> }


    >
    > It seems that many people misunderstood my original post. What I'm
    > looking for is of the syntax,
    >
    > min(x1, x2, x3, x4, ..., x_n); // where n can be any number.


    This is hideous but you could do something like:

    template<typename T, class Compare = std::less<T> >
    struct min_of
    {
    const T& value;

    min_of(const T& v):value(v){}

    min_of operator()(const T& v) const
    {
    return (Compare()(value,v))?*this:min_of(v);
    }
    };


    int main()
    {
    int a=-10;
    const int b=20;
    int min_val=min_of<int>(1)(a)(2)(b)(-1)(4).value;
    std::cout<<min_val<<std::endl;

    return 0;
    }

    --
    Michael
     
    Michael DOUBEZ, Sep 4, 2008
    #8
  9. On 3 Sep, 20:33, Peng Yu <> wrote:

    > I'm wondering if there is a min function (in boost, maybe?) that
    > accepts any number of arguments? std::min only accepts two arguments.
    > If I want to get the minimum number out of many, I have use std::min
    > many times, which is not convenient.


    put them in a container and use min_element()?
    You really want to use Lisp don't you? :)

    --
    Nick Keighley
     
    Nick Keighley, Sep 4, 2008
    #9
  10. Peng Yu wrote:
    > It seems that many people misunderstood my original post.


    I don't think they misunderstood. They are just saying "there's no
    easy way of doing that with the current C++, but here is an alternative
    approach". For some reason they want to leave out the first part rather
    then say it explicitly.
     
    Juha Nieminen, Sep 4, 2008
    #10
  11. Peng Yu

    Daniel T. Guest

    On Sep 3, 9:22 pm, Peng Yu <> wrote:
    > On Sep 3, 7:21 pm, "Daniel T." <> wrote:
    >
    >
    >
    >
    >
    > > Peng Yu <> wrote:
    > > > I'm wondering if there is a min function (in boost, maybe?) that
    > > > accepts any number of arguments? std::min only accepts two arguments.
    > > > If I want to get the minimum number out of many, I have use std::min
    > > > many times, which is not convenient.

    >
    > > Yes there is.

    >
    > > void fn( const vector<int>& vec )
    > > {
    > >    if ( !vec.empty() ) {
    > >       int m = *min_element( vec.begin(), vec.end() );
    > >       // m now equals the minimum value of the vector
    > >       // so use it
    > >       cout << "minimum value == " << m << '\n';
    > >    }

    >
    > > }

    >
    > Hi,
    >
    > It seems that many people misunderstood my original post. What I'm
    > looking for is of the syntax,
    >
    > min(x1, x2, x3, x4, ..., x_n); // where n can be any number.


    You have an arbitrary number of variables that are all related, but
    you don't have them in an array? That's silly.

    Put your variables in a vector and call min_element.
     
    Daniel T., Sep 4, 2008
    #11
  12. Peng Yu wrote:

    > Hi,
    >
    > I'm wondering if there is a min function (in boost, maybe?) that
    > accepts any number of arguments? std::min only accepts two arguments.
    > If I want to get the minimum number out of many, I have use std::min
    > many times, which is not convenient.


    Well, if you really want it:
    ----------------
    namespace peng_yu
    {
    template<typename T>
    struct tmp_min_t
    {
    const T &item;
    tmp_min_t(const T &n) : item(n) {}
    operator const T& () const { return item; }
    };

    struct minimum_t {} minimum;

    template<typename T>
    inline tmp_min_t<T> operator , (minimum_t, const T &x)
    {
    return tmp_min_t<T>(x);
    }
    template<class T>
    inline tmp_min_t<T> operator , (tmp_min_t<T> a, const T &x)
    {
    if (a.item<=x) return a;
    else return tmp_min_t<T>(x);
    }
    }

    #define MIN(...) (peng_yu::minimum,__VA_ARGS__)

    #include <iostream>

    int main()
    {
    std::cout
    << MIN(6,5,4,5,1,5,3,5,7,4,3,4,6,8,5,3,2,-23,5,2,2,4,6,4,4,3,4)
    << std::endl;
    }
    --------------
    You'll need a compiler with C99-style variadic macro support though
    (which is supported by most compilers I am aware of), or preprocess
    your source accordingly.
     
    Marco Manfredini, Sep 4, 2008
    #12
  13. Peng Yu

    kwikius Guest

    On Sep 5, 8:37 pm, Pete Becker <> wrote:
    > On 2008-09-03 15:33:32 -0400, Peng Yu <> said:
    >
    >
    >
    > > I'm wondering if there is a min function (in boost, maybe?) that
    > > accepts any number of arguments? std::min only accepts two arguments.
    > > If I want to get the minimum number out of many, I have use std::min
    > > many times, which is not convenient.

    >
    > There will be, in the next C++ standard. But not yet.


    Well. If it returns by const ref like the current one then I'll
    certainly be rolling my own again.. as I do now ;-)


    regards
    Andy Little
     
    kwikius, Sep 7, 2008
    #13
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Lois
    Replies:
    1
    Views:
    3,409
    Ryan Stewart
    Dec 27, 2004
  2. juergen
    Replies:
    3
    Views:
    584
    opalinski from opalpaweb
    Sep 20, 2006
  3. Albert Hopkins

    When is min(a, b) != min(b, a)?

    Albert Hopkins, Jan 21, 2008, in forum: Python
    Replies:
    31
    Views:
    863
    Albert van der Horst
    Feb 4, 2008
  4. globalrev
    Replies:
    14
    Views:
    374
    Bruno Desthuilliers
    Apr 28, 2008
  5. carmen

    Converting hrs and min to just min

    carmen, Aug 10, 2004, in forum: ASP General
    Replies:
    4
    Views:
    154
    carmen
    Aug 10, 2004
Loading...

Share This Page