Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 丢失对容器内对象的引用_C++_C++11_Pass By Reference - Fatal编程技术网

C++ 丢失对容器内对象的引用

C++ 丢失对容器内对象的引用,c++,c++11,pass-by-reference,C++,C++11,Pass By Reference,我正在努力修复一段代码,尽管我相信我知道原因。我确实搜索了很多关于堆栈溢出的问题,很多人都有类似的问题(并提供了很好的答案),但我仍然不确定我是否理解代码中的问题 我试着举一个较小的例子,但我的结构本身并不简单。我希望下面的内容足够简单 我对摘录的目标是: 有一个点的向量 有一个线段向量。(其端点参照上述向量中的点) 有一个事件向量。(保留对参展环节和点的参考) segment::segment(点&pt1,点&pt2,inti){ s=&pt1;e=&pt2;ind=i;//点*s,点*e

我正在努力修复一段代码,尽管我相信我知道原因。我确实搜索了很多关于堆栈溢出的问题,很多人都有类似的问题(并提供了很好的答案),但我仍然不确定我是否理解代码中的问题

我试着举一个较小的例子,但我的结构本身并不简单。我希望下面的内容足够简单

我对摘录的目标是:

  • 有一个点的向量

  • 有一个线段向量。(其端点参照上述向量中的点)

  • 有一个事件向量。(保留对参展环节和点的参考)

segment::segment(点&pt1,点&pt2,inti){
s=&pt1;e=&pt2;ind=i;//点*s,点*e,int ind
}
事件::事件(段和s、点和点、点和点){
seg=&s;type=tp;p=&pt;//段*seg,整型,点*p
}
无效预处理(整数大小、标准::向量和pts、标准::向量和EVT、,
标准:矢量和segs){
浮动x,y;
对于(int i=0;i>x>>y;
pts.push_back({x,y});
}
对于(int i=0;istd::cout
在向量上向后推
(可能)使以前的引用/迭代器无效

它发生在那里的环路中

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});

您必须
分段中保留足够的位置
以避免重新分配(或更改逻辑)。

在向量上向后推
(可能)使以前的引用/迭代器无效

它发生在那里的环路中

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});

您必须
分段中保留
足够的位置,以避免重新分配(或更改逻辑)。

看起来向量会自行调整大小,并且必须重新定位(这将使所有迭代器引用无效)

在处理之前,请尝试使用
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";
}
void pre_过程(整数大小、标准::向量和pts、标准::向量和EVT、,
标准:矢量和segs){
临时储备(规模);
evts储备(规模);
分段储备(规模);
浮动x,y;
对于(int i=0;i>x>>y;
pts.push_back({x,y});
}
对于(int i=0;istd::cout看起来向量自身调整了大小,必须重新定位(这将使所有迭代器引用无效)

在处理之前,请尝试使用
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";
}
void pre_过程(整数大小、标准::向量和pts、标准::向量和EVT、,
标准:矢量和segs){
临时储备(规模);
evts储备(规模);
分段储备(规模);
浮动x,y;
对于(int i=0;i>x>>y;
pts.push_back({x,y});
}
对于(int i=0;istd::cout有趣。它解决了我的测试集的问题。我现在正试图理解为什么。如果我首先构建了SEG,问题还会持续吗?我从来没有遇到过这个问题。
std::vector
是连续的容器。一旦达到容量,它必须重新分配,并在新的缓冲区中移动以前的值,使其失效y对旧缓冲区的引用。一旦构建(或保留),您不再使引用/迭代器无效。很有意思。它解决了我的测试集的问题。我现在正在尝试理解为什么。如果我第一次构建segs,问题还会持续吗?我从来没有遇到过这个问题。
std::vector
是连续容器。一旦达到容量,它必须重新分配并移动上一个值在新缓冲区中,使对旧缓冲区的每个引用无效。一旦构建(或保留),就不再使引用/迭代器无效。