丢失对容器内对象的引用
Losing references to objects inside containers
我正在努力修复一段代码,即使我相信我知道原因。我确实在 Stack Overflow 上搜索了很多,很多人都有类似的问题(并且提供了很好的答案(,但我仍然不确定我是否理解我的代码的问题。
我尝试举一个较小的例子,但我的结构本身并不简单。我希望以下内容足够简单。
我对摘录的目标:
-
有一个点向量。
-
有一个段向量。(其端点引用上述向量中的点(
-
有一个事件向量。(保留对引出段和点的引用(
segment::segment (point &pt1, point&pt2, int i) {
s = &pt1; e = &pt2; ind = i; // point *s, point *e, int ind
}
event::event (segment &s, point &pt, int tp) {
seg = &s; type = tp; p = &pt; //segment *seg, int type, point *p
}
void pre_process (int size, std::vector<point>& pts, std::vector<event>& evts,
std::vector<segment>& segs) {
float x, y;
for (int i = 0; i < size; ++ i) {
std::cin >> x >> y;
pts.push_back({x,y});
}
for (int i = 0; i < size; ++i) {
int j = (i+1)%size;
if (cmpXY(pts[i], pts[j]))
segs.push_back({pts[i], pts[j], i});
else
segs.push_back({pts[j], pts[i], i});
evts.push_back({segs[i], *segs[i].s, 0});
evts.push_back({segs[i], *segs[i].e, 1});
std::cout << 2*i << "n";
std::cout << segs[i].s << "n"; //ALWAYS EQUAl
std::cout << evts[2*i].seg->s << "n";
} // LINE X
for (int i = 0; i < size; ++i) { //LINE Y
std::cout << 2*i << "n";
std::cout << segs[i].s << "n"; //DIFFERENT SOMETIMES
std::cout << evts[2*i].seg->s << "n";
}
所以,问题是我的对象指向的某些地址从 X 行更改为 Y 行。特别是,pts 和 segs 保持不变。
根据我所知道的以及我在这里或这里所理解的,我无法在任何函数的堆栈(例如我的 for 循环(上获取对对象的引用。但是,我相信容器上对象的生存期与容器本身相同。这让我相信我push_back()
的所有对象都应该通过函数pre_proccess和调用它的函数持久化。
向量上的push_back
(可能(使以前的引用/迭代器无效。
它发生在那里的循环中
if (cmpXY(pts[i], pts[j]))
segs.push_back({pts[i], pts[j], i});
else
segs.push_back({pts[j], pts[i], i});
evts.push_back({segs[i], *segs[i].s, 0});
您必须在segs
中reserve
足够的位置以避免重新分配(或更改逻辑(。
看起来向量会调整自身大小并且必须重新定位(这将使所有迭代器引用无效(。
在处理之前尝试使用std::vector::reserve
:
void pre_process (int size, std::vector<point>& pts, std::vector<event>& evts,
std::vector<segment>& segs) {
pts.reserve(size);
evts.reserve(size);
segs.reserve(size);
float x, y;
for (int i = 0; i < size; ++ i) {
std::cin >> x >> y;
pts.push_back({x,y});
}
for (int i = 0; i < size; ++i) {
int j = (i+1)%size;
if (cmpXY(pts[i], pts[j]))
segs.push_back({pts[i], pts[j], i});
else
segs.push_back({pts[j], pts[i], i});
evts.push_back({segs[i], *segs[i].s, 0});
evts.push_back({segs[i], *segs[i].e, 1});
std::cout << 2*i << "n";
std::cout << segs[i].s << "n"; //ALWAYS EQUAl
std::cout << evts[2*i].seg->s << "n";
} // LINE X
for (int i = 0; i < size; ++i) { //LINE Y
std::cout << 2*i << "n";
std::cout << segs[i].s << "n"; //DIFFERENT SOMETIMES
std::cout << evts[2*i].seg->s << "n";
}
相关文章:
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- 我们可以有一个 setter 成员函数作为从 const 对象引用的 const 吗?
- C++对象引用返回不同的值
- 对象引用中的字段以不同的方法返回不同的值
- 通过向构造函数其他对象引用页面来创建对象
- 为什么在对象引用恒定时允许更改为另一个类的指针的成员变量
- 如何在C++中读取 HDF5 对象引用
- C++ 未定义的对象引用
- 从函数返回 libconfig 类设置对象引用
- qt vsaddin错误对象引用未设置为对象的istanse
- 在这种情况下,为什么使用 *此必需的对象引用返回对象引用
- 基本C - 构造contaning对象引用,并将其作为方法参数传递
- C :将对象引用作为参数给出错误:呼叫class :: function()的匹配函数
- C++OOP基础知识-是否正确返回对象引用
- 使用对象引用(可能)在调用destructor后使用对象引用
- 创建返回对象引用的成员函数的最简单方法
- 如何在C++上使用对象引用删除对象
- JNI/Android NDK-维护全局对象引用
- 为什么有些类方法返回"*this"(self的对象引用)?
- 在C++中返回伪对象引用的规则