2016-10-27 5 views
-2

Я работаю над уже существующим кодом и проверяет, работает ли он.Откат элементов в C++ std :: vector, они теряют информацию

С величайшим удивлением, эти основные классы дают мне неприятность

typedef int Id; 
typedef int BcId; 

//! This class gives some common methods to all mesh objects. 
class Identifier{ 
public: 

    static const UInt NVAL; 

    Identifier(UInt id):id_(id),bcId_(NVAL){} 
    Identifier(UInt id, UInt bcId):id_(id),bcId_(bcId){} 

    bool unassignedId()const {return id_==NVAL;} 
    bool unassignedBc()const {return bcId_==NVAL;} 

    Id id() const {return id_;} 
    BcId bcId() const {return bcId_;} 
    Id getId() const {return id_;} 


    protected: 
    Id id_; 
    BcId bcId_; 
}; 


//! This class implements a 3D point, the default is z=0 => 2D point 
class Point: public Identifier{ 
public: 

    static const UInt ndim = 3; 

    Point(): Identifier(NVAL, NVAL){coord_.resize(3);}; 
    Point(Real x, Real y, Real z=0):Identifier(NVAL, NVAL) 
     {coord_.resize(3);coord_[0]=x; coord_[1]=y; coord_[2]=x;} 
    Point(Id id, BcId bcId, Real x, Real y, Real z=0):Identifier(id, bcId) 
     {coord_.resize(3);coord_[0]=x; coord_[1]=y; coord_[2]=z;} 
    void print(std::ostream & out) const; 
    Real operator[](UInt i) const {return coord_[i];} 

    private: 
    std::vector<Real> coord_; 

}; 

void Point::print(std::ostream & out) const 
{ 
out<<"Point -"<< id_ <<"- "<<"("<<coord_[0]<<","<<coord_[1]<<","<<coord_[2]<<")"<<std::endl<<"------"<<std::endl; 
} 

Теперь простейшим тест:

int main() 
{ 
    Point a(1,1,0,0); 
    Point b(2,2,0,1); 
    Point c(3,3,1,0); 

    a.print(std::cout); 
    b.print(std::cout); 
    c.print(std::cout); 

    std::cout<<b.getId()<<std::endl; 
    b.print(std::cout); 

    std::vector<Point> points; 
    points.resize(3); 
    points.push_back(c); 
    points.push_back(b); 
    points.push_back(a); 


    std::cout<<"The points are"<<std::endl; 
    for (int i=0; i<3; ++i) 
     points[i].print(std::cout); 
    std::cout<<std::endl; 

} 

Я получаю результат:

Point -1- (0,0,0) 
------ 
Point -2- (0,1,0) 
------ 
Point -3- (1,0,0) 
------ 
2 
Point -2- (0,1,0) 
------ 
The points are 
Point -2147483647- (0,0,0) 
------ 
Point -2147483647- (0,0,0) 
------ 
Point -2147483647- (0,0,0) 
+0

Что вы думаете об этом 'points.resize (3);'? – Danh

+0

Подсказка: 'for (int i = 3; i <6; ++ i)' – George

+0

Так чертовски глупо :) – user5609462

ответ

3

Вопрос здесь вы используете points.resize(3); вместо points.reserve(3);. std::vector:::resize изменится на размер вектора до размера. Если вектор растет, то он вставляет необходимые построенные по умолчанию объекты. В этом случае это означает, что первые 3 элемента вектора построены по умолчанию, и 3 пункта, которые вы вставляете в него, фактически находятся в индексе [3, 5].

Если вы вызвали std::vector::reserve, тогда он выделил пространство для 3 объектов, но не создавал бы экземпляры по умолчанию. Это означает, что когда вы нажимаете точки назад, задержка будет занимать индекс [0, 2]

1

vector::resize является не правильная функция, она фактически изменяет размер массива, push_back затем добавляет еще один три элемента к нему.

Возможно, вы использовали vector::reserve.

 Смежные вопросы

  • Нет связанных вопросов^_^