std::valarray as value in std::map

Discussion in 'C++' started by Chris Forone, Nov 3, 2007.

  1. Chris Forone

    Chris Forone Guest

    Hello group,

    g++ (3.4.2, mingw):

    float init[] = {1.f, 2.f, 3.f};
    std::map<std::string, std::valarray<float> > mp;

    mp["name"] = std::valarray(init, 3);
    mp["name"].size(); // should be 3, but IS 0!

    Do i ignored something? Does map not do a copy of value?

    HAND, Chris
     
    Chris Forone, Nov 3, 2007
    #1
    1. Advertising

  2. Chris Forone

    Chris Forone Guest

    Chris Forone schrieb:
    > Hello group,
    >
    > g++ (3.4.2, mingw):
    >
    > float init[] = {1.f, 2.f, 3.f};
    > std::map<std::string, std::valarray<float> > mp;
    >
    > mp["name"] = std::valarray(init, 3);
    > mp["name"].size(); // should be 3, but IS 0!
    >
    > Do i ignored something? Does map not do a copy of value?
    >
    > HAND, Chris


    compilable:

    #include <iostream>
    #include <map>
    #include <valarray>

    int main()
    {
    float init[] = {1.f, 2.f, 3.f};
    std::map<std::string, std::valarray<float> > mp;

    mp["name"] = std::valarray<float>(init, 3);

    std::cout << mp["name"].size() << std::endl;
    }

    g++ (4.1.2, ubuntu) has the same behavior...

    Chris
     
    Chris Forone, Nov 3, 2007
    #2
    1. Advertising

  3. Chris Forone

    Chris Forone Guest

    Chris Forone schrieb:
    > Chris Forone schrieb:
    >> Hello group,
    >>
    >> g++ (3.4.2, mingw):
    >>
    >> float init[] = {1.f, 2.f, 3.f};
    >> std::map<std::string, std::valarray<float> > mp;
    >>
    >> mp["name"] = std::valarray(init, 3);
    >> mp["name"].size(); // should be 3, but IS 0!
    >>
    >> Do i ignored something? Does map not do a copy of value?
    >>
    >> HAND, Chris

    >
    > compilable:
    >
    > #include <iostream>
    > #include <map>
    > #include <valarray>
    >
    > int main()
    > {
    > float init[] = {1.f, 2.f, 3.f};
    > std::map<std::string, std::valarray<float> > mp;
    >
    > mp["name"] = std::valarray<float>(init, 3);
    >
    > std::cout << mp["name"].size() << std::endl;
    > }
    >
    > g++ (4.1.2, ubuntu) has the same behavior...
    >
    > Chris


    SOLVED!

    ..insert does the trick... operator[] only does std-ctor...

    HAND, Chris
     
    Chris Forone, Nov 3, 2007
    #3
  4. Chris Forone

    Pete Becker Guest

    On 2007-11-03 10:20:01 -0400, Chris Forone <> said:

    > Chris Forone schrieb:
    >> Chris Forone schrieb:
    >>> Hello group,
    >>>
    >>> g++ (3.4.2, mingw):
    >>>
    >>> float init[] = {1.f, 2.f, 3.f};
    >>> std::map<std::string, std::valarray<float> > mp;
    >>>
    >>> mp["name"] = std::valarray(init, 3);
    >>> mp["name"].size(); // should be 3, but IS 0!
    >>>
    >>> Do i ignored something? Does map not do a copy of value?
    >>>
    >>> HAND, Chris

    >>
    >> compilable:
    >>
    >> #include <iostream>
    >> #include <map>
    >> #include <valarray>
    >>
    >> int main()
    >> {
    >> float init[] = {1.f, 2.f, 3.f};
    >> std::map<std::string, std::valarray<float> > mp;
    >> mp["name"] = std::valarray<float>(init, 3);
    >> std::cout << mp["name"].size() << std::endl;
    >> }
    >>
    >> g++ (4.1.2, ubuntu) has the same behavior...
    >>
    >> Chris

    >
    > SOLVED!
    >
    > .insert does the trick... operator[] only does std-ctor...
    >


    No, it doesn't. It just happens to look like it works. The problem has
    nothing to do with valarray: you'll see the same behavior with any type
    for the value. The problem is in the index, not the value. Quoted
    strings are not guaranteed to be unique, so mp["name"] may be a
    different map element than some other mp["name"].

    --
    Pete
    Roundhouse Consulting, Ltd. (www.versatilecoding.com) Author of "The
    Standard C++ Library Extensions: a Tutorial and Reference
    (www.petebecker.com/tr1book)
     
    Pete Becker, Nov 5, 2007
    #4
  5. Chris Forone

    James Kanze Guest

    On Nov 5, 2:22 pm, Pete Becker <> wrote:
    > On 2007-11-03 10:20:01 -0400, Chris Forone <> said:
    > > Chris Forone schrieb:
    > >> Chris Forone schrieb:
    > >>> Hello group,


    > >>> g++ (3.4.2, mingw):


    > >>> float init[] = {1.f, 2.f, 3.f};
    > >>> std::map<std::string, std::valarray<float> > mp;


    > >>> mp["name"] = std::valarray(init, 3);
    > >>> mp["name"].size(); // should be 3, but IS 0!


    > >>> Do i ignored something? Does map not do a copy of value?


    > >>> HAND, Chris


    > >> compilable:


    > >> #include <iostream>
    > >> #include <map>
    > >> #include <valarray>


    > >> int main()
    > >> {
    > >> float init[] = {1.f, 2.f, 3.f};
    > >> std::map<std::string, std::valarray<float> > mp;
    > >> mp["name"] = std::valarray<float>(init, 3);
    > >> std::cout << mp["name"].size() << std::endl;
    > >> }


    > >> g++ (4.1.2, ubuntu) has the same behavior...


    > > SOLVED!


    > > .insert does the trick... operator[] only does std-ctor...


    > No, it doesn't. It just happens to look like it works. The
    > problem has nothing to do with valarray: you'll see the same
    > behavior with any type for the value. The problem is in the
    > index, not the value. Quoted strings are not guaranteed to be
    > unique, so mp["name"] may be a different map element than some
    > other mp["name"].


    But his map uses std::string as a key, not char const*, so the
    string literal will be converted.

    I'm not familiar enough with valarray to really comment, but his
    initial use of std::map seems correct: the call to mp["name"]
    does insert a valarray constructed withe the default
    constructor, before returning a reference to the new object; the
    assignment operator then does whatever the assignment operator
    for valarray does.

    --
    James Kanze (GABI Software) email:
    Conseils en informatique orientée objet/
    Beratung in objektorientierter Datenverarbeitung
    9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
     
    James Kanze, Nov 5, 2007
    #5
  6. Chris Forone

    Pete Becker Guest

    On 2007-11-05 12:13:44 -0500, James Kanze <> said:

    > On Nov 5, 2:22 pm, Pete Becker <> wrote:
    >
    >> No, it doesn't. It just happens to look like it works. The
    >> problem has nothing to do with valarray: you'll see the same
    >> behavior with any type for the value. The problem is in the
    >> index, not the value. Quoted strings are not guaranteed to be
    >> unique, so mp["name"] may be a different map element than some
    >> other mp["name"].

    >
    > But his map uses std::string as a key, not char const*, so the
    > string literal will be converted.
    >


    Whoops, sorry about confusing the issue.

    --
    Pete
    Roundhouse Consulting, Ltd. (www.versatilecoding.com) Author of "The
    Standard C++ Library Extensions: a Tutorial and Reference
    (www.petebecker.com/tr1book)
     
    Pete Becker, Nov 5, 2007
    #6
    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. Jim West
    Replies:
    2
    Views:
    500
    Jim West
    Dec 23, 2003
  2. map of valarray

    , May 24, 2006, in forum: C++
    Replies:
    3
    Views:
    349
  3. Replies:
    1
    Views:
    428
    red floyd
    Dec 21, 2008
  4. Thomas J. Gritzan
    Replies:
    6
    Views:
    1,025
    James Kanze
    Dec 22, 2008
  5. James Kanze
    Replies:
    0
    Views:
    2,006
    James Kanze
    Dec 21, 2008
Loading...

Share This Page