矢量元素变为随机值

时间:2018-03-23 06:38:50

标签: c++

我正在尝试解决infoarena.ro上的问题(类似于codeforces.com的网站,但它是罗马尼亚语),并且出于某种原因,集合中的某些元素只是更改为随机值。相关代码:

#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;

ofstream out("test.out");
ifstream in("test.in");

struct Edge
{
    int from, to, color, index;
    bool erased = false, visited = false;
};

struct Event;
int point(const Event* event);

struct Event
{
    int time;
    bool add;
    Edge *edge;

    bool operator < (const Event other) const
    {
        return (this->time < other.time) ||
               (this->time == other.time && this->add < other.add) ||
               (this->time == other.time && this->add < other.add && 
               point(this)>point(&other));
    }
};

int point(const Event* event)
{
    if(event->edge->from == event->time)
        return event->edge->to;
    else
        return event->edge->from;
}

vector<Edge> edges;
vector<Event> events;

int main()
{
    int N, M;
    in >> N >> M;
    for(int i = 0; i < M; i++)
    {
        int x, y;
        in >> x >> y;
        if(x > y)
            swap(x, y);
        Edge e = {x, y, i, i};
        edges.push_back(e);
        events.push_back(Event{x, true, &edges.back()});
        Edge debug = *events.back().edge;
        events.push_back(Event{y, false, &edges.back()});
        debug = *events.back().edge;
    }
    sort(events.begin(), events.end());
    for(Event event : events)
        out << event.edge->from << " " << event.edge->to << "\n";

    return 0;
}

我排除了我写的与问题无关的代码。

输入:     5 6     1 2     2 5     1 4     3 1     4 3     5 3

第一行是N(顶点数)和M(边数)。下一行是所有边缘。

输出:

44935712 44896968
1 4
1 3
44935712 44896968
3 1941924608
1 3
3 4
3 5
1 4
3 4
3 1941924608
3 5 

我正在努力制作一本&#34; journal&#34;就像我的老师所说的那样。对于每个边(x,y),我想在阶段x将其添加到堆栈中,并在阶段y(与堆栈中的所有其他元素一起擦除它直到我到达(x,y))。我想按时间排序&#34;当我进行这些操作时(因此&#34;时间&#34;在事件结构中的值)。 &#34;添加&#34;指示这是添加边缘还是从堆栈中删除边缘的事件。

我正在&#34;事件中输出边缘&#34;用于调试目的的向量,我注意到值变为随机的东西。有人可以解释为什么会这样吗?

1 个答案:

答案 0 :(得分:5)

问题出在这里

events.push_back(Event{x, true, &edges.back()});

在这里

events.push_back(Event{y, false, &edges.back()});

当您将结构推入edges向量时,向量将重新分配存储所包含结构所需的内存。如果发生这样的重定位,则向量中的所有迭代器 和指针 将变为无效。

一个简单的解决方案是将指针存储在edges向量中,并复制Event结构的指针。另一种可能的解决方案是做两次通过。一个创建edges向量,然后单独传递(循环)以创建events向量。