指向vector的指针只返回vector的最后一个值
Pointers to vector returns only last value of vector
我得到了以下代码,具有结构体HE_face的矢量和结构体HE_edge的数组。基于一些测试,我设置了向面向量添加一个新的面,并将每个前进边设置为添加到面向量的最后一个面。然而,由于某种原因,输出是所有的边都被设置为添加到面向量的相同的最终面。
而不是输出:
edge: 0 face: 0
edge: 1 face: 0
edge: 2 face: 0
edge: 3 face: 1
edge: 4 face: 1
edge: 5 face: 1
我得到了输出:
edge: 0 face: 1
edge: 1 face: 1
edge: 2 face: 1
edge: 3 face: 1
edge: 4 face: 1
edge: 5 face: 1
任何建议,我做错了,将非常感激!
谢谢!
vector<HE_face> f_list ;
int size = 6 ;
HE_edge *edges[size] ;
struct HE_face
{
HE_face( HE_edge* e, unsigned long i ) : edge(e), normal(NULL), index(i) {}
HE_face( HE_edge* e, HE_normal* n, unsigned long i ) : edge(e), normal(n), index(i) {}
unsigned long index ;
HE_edge* edge ;
HE_normal* normal ;
} ;
struct HE_edge
{
HE_edge( HE_vertex* v, HE_edge* p, HE_face* f, HE_edge* n ) : vertex(v), pair(p), face(f), next(n) {}
HE_edge* next ;
HE_vertex* vertex ;
HE_face* face ;
HE_edge* pair ;
} ;
for( int i = 0 ; i < size ; i++ ) // create the edges
{
if( i%3==0 )
f_list.push_back( HE_face( edges[i], f_list.size() ) ) ;
edges[i]->face = &f_list.back() ; // set the face of the edge
}
for( int i = 0 ; i < size ; i++ )
cout << "edge: " << i << " face: " << edges[i]->face->index << endl ;
您取f_list
元素的地址,该地址随后被push_back()
失效。
引用我最喜欢的非官方参考:
这有效地将vector的大小增加1,如果vector的大小等于调用前的vector容量,则会导致内部分配的存储空间重新分配。重新分配会使之前获得的所有迭代器、引用和指针失效。——http://www.cplusplus.com/reference/stl/vector/push_back/
当您说edges[i]->face = &f_list.back() ;
时,您将指针存储到向量内部数据中,该指针仅在下一次修改向量的调用之前有效。因此,当您下次调用push_back
时,这些指针变得无效(悬空)并且未定义解引用它们。
相关文章:
- 在c++中用vector填充一个简单的动态数组
- lower_bound()返回最后一个元素
- 获取向量C++中第一个值和最后一个值的和
- 使用运算符 [] 引用 std::vector 上最后一个元素时出现问题<>
- 将 vector<vector> 的最后一个元素移动到<int>开头
- 在std :: vector中找到最后一个非零元素
- C++中的 vector 只能读取最后一个元素
- vector.back() 可以用来为向量的最后一个元素赋值吗?
- 当第一个 itr 在最后一个 itr 之后时,std::vector 范围构造函数的官方行为是什么?
- 检查该元素是std :: vector中的第一个还是最后一个
- vector.erase-它总是删除我的最后一个元素
- 使用end()--迭代到std::vector的最后一个元素
- std::vector::erase删除最后一个元素而不是第一个元素
- vector::erase不会擦除所需的元素,而是从向量中擦除最后一个元素
- vector的最后一个对象覆盖所有对象
- c++ STL vector.erase()总是删除最后一个元素
- std::vector size()-1 ALWAYS给出最后一个元素的索引吗?
- 指向vector的指针只返回vector的最后一个值
- 在vector的最后一个元素中插入属性
- 查找std::vector中满足条件的最后一个元素