我的代码很小,它会引起二维顶点的类(vector2)的向量(vector2)和模板类Dynamicline的向量,该class dynamicline将vector2 type type type toge for参数。
std::vector<Vector2> m_coords;
std::vector<DynamicLine<Vector2>> m_lines;
Vector2 *lineVec = NULL;
bool draw = true;
case DrawingWidgetState::ADD_VERTEX_SELECTED:{
for(auto it = m_coords.begin(); it != m_coords.end(); it++)
if(it->distanceFrom(Vector2(event->x(), event->y())) < 20 && !m_coords.empty()){
draw = false;
break;
}
if(draw){
if(event->x() < m_mainWindow->width() - 10 && event->x() >= 10
&& event->y() < m_mainWindow->height() && event->y() >= 10) {
m_coords.push_back(Vector2(event->x(), event->y()));
update();
}
}
break;
}
case DrawingWidgetState::ADD_LINE_SELECTED:{
for(auto it = m_coords.begin(); it != m_coords.end(); it++)
if(it->distanceFrom(Vector2(event->x(), event->y())) < 10){
if(!i){
lineVec = &(*it);
i++;
}
else{
m_lines.push_back(DynamicLine<Vector2>(lineVec, &(*it)));
i = 0;
}
update();
break;
}
break;
}
问题是下一个。例如,如果我添加两个顶点和它们之间的一条线,那么一切都很好。但是,如果我现在添加另一个顶点(m_coords.push_back(vector2(event-> x(),event-> y()));),则将dissaperas和m_lines vector中的dissaperas和值更改为非常随机的大数字。我读了一些有关指针无效的东西。如果您将新值推向向量,那么有些值最终将被扩展。我还使用vector ::储备解决了我的问题,但是由于我确定我没有做正确的事/div>
我没有密切查看您的代码,但是似乎是向量导致您麻烦的矢量的重新分配。
矢量始终跟踪两个尺寸:其容量及其包含的对象数量。如果您进行push_back,并且其容量已经达到最大,则它将自身复制到具有更多空间和更大容量的内存中的另一个位置。您的指针可能仍指向原始位置。
使用向量时,最好保留索引而不是指针。
编辑:您可以通过一个可能执行插入操作的数组进行迭代。那不应该。
它很简单。当您push_back
和vector
没有足够的capacity
时,需要分配更多内存并复制(或移动)您的元素到新位置。这使指向旧元素的任何迭代器/指针无效(它们现在只是指向旧的释放内存块),这意味着它们基本上指向垃圾 - 因此,您必须在push_back
之后获得新的迭代器。
调用 reserve
告诉向量,请预先分配一个内存块,以便可以保证任何后续 push_back
不需要重新分配(如果您留在预订中(实际上是capacity
))和因此,不会使迭代器/指针无效。