std::vector question

Discussion in 'C++' started by Hamish, Dec 29, 2004.

  1. Hamish

    Hamish Guest

    I havea program which on execution gives unpredictable behaviour (it
    shouldn't). In trying to track down the problem, I'm wondering if there is a
    difference between these two ways of filling a std::vector with data:

    Method 1:

    std::vector<int> v;
    int k;

    for(i=0;i<n;i++){
    k = i + 3;
    v.push_back(k);
    }

    Method 2:

    std::vector<int> v;

    for(i=0;i<n;i++){
    int k = i + 3;
    v.push_back(k);
    }
     
    Hamish, Dec 29, 2004
    #1
    1. Advertising

  2. "Hamish" <> wrote...
    >I havea program which on execution gives unpredictable behaviour (it
    > shouldn't). In trying to track down the problem, I'm wondering if there is
    > a
    > difference between these two ways of filling a std::vector with data:
    >
    > Method 1:
    >
    > std::vector<int> v;
    > int k;
    >
    > for(i=0;i<n;i++){
    > k = i + 3;
    > v.push_back(k);
    > }
    >
    > Method 2:
    >
    > std::vector<int> v;
    >
    > for(i=0;i<n;i++){
    > int k = i + 3;
    > v.push_back(k);
    > }
    >
    >


    No, in this particular case there is no difference. However, something
    tells me that your real code, the code that gives you trouble, is a bit
    more complicated than that.

    It is often important to follow certain rules in your programming. For
    example, the famous "Rule of Three" (look it up). If your class has
    some kind of dynamic memory management, you simply _must_ follow it.

    V
     
    Victor Bazarov, Dec 29, 2004
    #2
    1. Advertising

  3. Hamish

    Chris Theis Guest

    "Hamish" <> wrote in message
    news:eek:DoAd.3372$...
    > I havea program which on execution gives unpredictable behaviour (it
    > shouldn't). In trying to track down the problem, I'm wondering if there is

    a
    > difference between these two ways of filling a std::vector with data:
    >
    > Method 1:
    >
    > std::vector<int> v;
    > int k;
    >
    > for(i=0;i<n;i++){
    > k = i + 3;
    > v.push_back(k);
    > }
    >
    > Method 2:
    >
    > std::vector<int> v;
    >
    > for(i=0;i<n;i++){
    > int k = i + 3;
    > v.push_back(k);
    > }
    >


    The only difference with these two methods is the scope of k but this
    doesn´t affect the behavior in this case. Please post your real code which
    gives you trouble.

    Cheers
    Chris
     
    Chris Theis, Dec 29, 2004
    #3
  4. Hamish

    KPB Guest

    Victor Bazarov wrote:

    > It is often important to follow certain rules in your programming. For
    > example, the famous "Rule of Three" (look it up).


    I'm actually interested in what this "rule of three" says but I'm
    getting lots of irrelevant hits on google. It seems that everybody has
    some "rule of three".

    Any hints?

    Thanks,
    KPB
     
    KPB, Dec 29, 2004
    #4
  5. Hamish

    Jeff Flinn Guest

    KPB wrote:
    > Victor Bazarov wrote:
    >
    >> It is often important to follow certain rules in your programming.
    >> For example, the famous "Rule of Three" (look it up).

    >
    > I'm actually interested in what this "rule of three" says but I'm
    > getting lots of irrelevant hits on google. It seems that everybody has
    > some "rule of three".
    >
    > Any hints?


    Googling 101: What language are you discussing? Add that to your search
    string.

    Jeff
     
    Jeff Flinn, Dec 29, 2004
    #5
  6. Hamish

    KPB Guest

    Jeff Flinn wrote:

    > Googling 101: What language are you discussing? Add that to your search
    > string.


    Please don't treat me like I'm an idiot. I'm not.

    Thanks,
    KPB
     
    KPB, Dec 29, 2004
    #6
  7. Hamish

    KPB Guest

    KPB wrote:
    > Victor Bazarov wrote:
    >
    >> It is often important to follow certain rules in your programming. For
    >> example, the famous "Rule of Three" (look it up).

    >
    >
    > I'm actually interested in what this "rule of three" says but I'm
    > getting lots of irrelevant hits on google. It seems that everybody has
    > some "rule of three".
    >
    > Any hints?
    >
    > Thanks,
    > KPB
    >
    >
    >
    >


    Nevermind Victor. I found them. I alredy know them. I don't think Scott
    Meyers refered to this as the "rule of three" but he did stress this
    nonetheless in his Effective C++ books.

    KPB
     
    KPB, Dec 29, 2004
    #7
  8. Hamish

    Hamish Guest

    > > I havea program which on execution gives unpredictable behaviour (it
    > > shouldn't). In trying to track down the problem, I'm wondering if there

    is
    > a
    > > difference between these two ways of filling a std::vector with data:
    > >
    > > Method 1:
    > >
    > > std::vector<int> v;
    > > int k;
    > >
    > > for(i=0;i<n;i++){
    > > k = i + 3;
    > > v.push_back(k);
    > > }
    > >
    > > Method 2:
    > >
    > > std::vector<int> v;
    > >
    > > for(i=0;i<n;i++){
    > > int k = i + 3;
    > > v.push_back(k);
    > > }
    > >

    >
    > The only difference with these two methods is the scope of k but this
    > doesn´t affect the behavior in this case. Please post your real code which
    > gives you trouble.


    I haven't been able to track down the problem yet. However, the only
    difference between an older version which worked, adn this version is the
    following data structures:

    std::vector<PolyTypeClass*> PolyTypes;

    class PolyTypeClass{
    public:
    PolyTypeClass();
    virtual ~PolyTypeClass();

    const PolyTypeClass& operator= (const PolyTypeClass& poly);
    void Copy(PolyTypeClass * pCopy);

    int ID;
    std::vector<BasePolygonClass> Rot;
    };

    class BasePolygonClass{
    public:
    BasePolygonClass();
    BasePolygonClass(int Size);
    virtual ~BasePolygonClass();

    const BasePolygonClass& operator= (const BasePolygonClass& poly);
    void Copy(BasePolygonClass * pCopy);

    std::vector<PointPropClass> Points;
    double Area;
    double Length;
    double Height;
    BOOL IsConvex;
    double Angle;
    BOOL XFlip;
    BOOL YFlip;
    };

    class PointPropClass
    {
    public:
    PointPropClass();
    virtual ~PointPropClass();
    const PointPropClass& operator= (const PointPropClass& poly);
    void Copy(PointPropClass * pCopy);

    BOOL TP;
    double Angle;
    int Num;
    int CavNum;
    int St;
    int Fin;
    int Type;
    BOOL Neg;
    BOOL IsGhosh;
    double x;
    double y;
    };
     
    Hamish, Dec 30, 2004
    #8
  9. Hamish

    Chris Theis Guest

    "Hamish" <> wrote in message
    news:pULAd.3637$...
    > > > I havea program which on execution gives unpredictable behaviour (it
    > > > shouldn't). In trying to track down the problem, I'm wondering if

    there
    > is
    > > a
    > > > difference between these two ways of filling a std::vector with data:
    > > >
    > > > Method 1:
    > > >
    > > > std::vector<int> v;
    > > > int k;
    > > >
    > > > for(i=0;i<n;i++){
    > > > k = i + 3;
    > > > v.push_back(k);
    > > > }
    > > >
    > > > Method 2:
    > > >
    > > > std::vector<int> v;
    > > >
    > > > for(i=0;i<n;i++){
    > > > int k = i + 3;
    > > > v.push_back(k);
    > > > }
    > > >

    > >
    > > The only difference with these two methods is the scope of k but this
    > > doesn´t affect the behavior in this case. Please post your real code

    which
    > > gives you trouble.

    >
    > I haven't been able to track down the problem yet. However, the only
    > difference between an older version which worked, adn this version is the
    > following data structures:
    >
    > std::vector<PolyTypeClass*> PolyTypes;
    >
    > class PolyTypeClass{
    > public:
    > PolyTypeClass();
    > virtual ~PolyTypeClass();
    >
    > const PolyTypeClass& operator= (const PolyTypeClass& poly);
    > void Copy(PolyTypeClass * pCopy);
    >
    > int ID;
    > std::vector<BasePolygonClass> Rot;
    > };
    >
    > class BasePolygonClass{
    > public:
    > BasePolygonClass();
    > BasePolygonClass(int Size);
    > virtual ~BasePolygonClass();
    >
    > const BasePolygonClass& operator= (const BasePolygonClass& poly);
    > void Copy(BasePolygonClass * pCopy);
    >
    > std::vector<PointPropClass> Points;
    > double Area;
    > double Length;
    > double Height;
    > BOOL IsConvex;
    > double Angle;
    > BOOL XFlip;
    > BOOL YFlip;
    > };
    >
    > class PointPropClass
    > {
    > public:
    > PointPropClass();
    > virtual ~PointPropClass();
    > const PointPropClass& operator= (const PointPropClass& poly);
    > void Copy(PointPropClass * pCopy);
    >
    > BOOL TP;
    > double Angle;
    > int Num;
    > int CavNum;
    > int St;
    > int Fin;
    > int Type;
    > BOOL Neg;
    > BOOL IsGhosh;
    > double x;
    > double y;
    > };
    >


    What strikes me (although in this case it should not pose a problem after a
    quick glance at your code) is that you do supply a dtor and an assignment op
    but not a copy ctor. If you really need a dtor & an assignment op it´s good
    practice to supply a copy ctor too.

    If you could please post the actual code of "Method 1" & "Method 2" which
    works with your data structures and also the implementation of the Copy()
    method would be interesting.

    Cheers
    Chris
     
    Chris Theis, Dec 30, 2004
    #9
    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. Peter Jansson
    Replies:
    5
    Views:
    6,423
    Ivan Vecerina
    Mar 17, 2005
  2. Anonymous
    Replies:
    20
    Views:
    4,427
    Pete Becker
    Mar 30, 2005
  3. Jason Heyes
    Replies:
    8
    Views:
    767
    Andrew Koenig
    Jan 15, 2006
  4. Replies:
    8
    Views:
    1,998
    Csaba
    Feb 18, 2006
  5. Rune Allnor
    Replies:
    4
    Views:
    992
    Rune Allnor
    Dec 11, 2008
Loading...

Share This Page