C++ 指向丢失其值的对象向量的指针

C++ 指向丢失其值的对象向量的指针,c++,c++11,object,pointers,C++,C++11,Object,Pointers,我一直在为我的硕士论文做一个项目。在这个项目中,我有一个名为节点的父类和一些其他子类,例如,类和。我还有一个名为graph的类,其中使用std::map存储节点。我得出结论,我不需要使用std::map。使用std::vector可以更快地访问图中的节点 AND类有两个向量:一个用于输入,另一个用于输出。我有两种方法将节点指针添加到这两个向量之一 当我在graph类中从map更改为vector时,和节点中的一些指针正在丢失它们的值 我对指针做了一些研究,在我看来我没有做错什么。我在这里迷路了 c

我一直在为我的硕士论文做一个项目。在这个项目中,我有一个名为节点的父类和一些其他子类,例如,类。我还有一个名为graph的类,其中使用std::map存储节点。我得出结论,我不需要使用std::map。使用std::vector可以更快地访问图中的节点

AND类有两个向量:一个用于输入,另一个用于输出。我有两种方法将节点指针添加到这两个向量之一

当我在graph类中从map更改为vector时,和节点中的一些指针正在丢失它们的值

我对指针做了一些研究,在我看来我没有做错什么。我在这里迷路了

class node{
protected:
    unsigned int id;
public:
    virtual void pushOutput(node* param){}
    virtual void pushInput(node* param,bool param_polarity){}
}

class AND : public node{
    vector <node*> inputs;
    vector <node*> outputs;
public:
   void pushOutput(node* param) override;
   void pushInput(node* param,bool param_polarity) override;
}

void AND::pushOutput(node* param){
    this->outputs.push_back(param);
}

//AND::pushInput is omitted, but it is pretty similar to AND::pushOutput except with a bunch of ifs.

class graph {
protected:
//    map<unsigned int,AND> all_ANDS;
    vector<AND> all_ANDS;
public:
    AND* pushAnd(unsigned int index,AND AND_obj); 
    AND* findAnd(unsigned int);
}

AND* graph::pushAnd(unsigned int index, AND AND_obj){
//    std::pair<std::map<unsigned int,AND>::iterator,bool> ret;
//    ret=this->all_ANDS.insert(pair<unsigned int,AND>(index,AND_obj));
    all_ANDS.push_back(AND_obj);
    return &all_ANDS.back();
}

AND* graph::findAnd(unsigned int param){
//    return &this->all_ANDS.find(param)->second;
    return &all_ANDS[param];
}
类节点{
受保护的:
无符号整数id;
公众:
虚拟输出(节点*param){}
虚空pushInput(node*param,bool-param_极性){}
}
类和:公共节点{
矢量输入;
矢量输出;
公众:
无效pushOutput(节点*参数)覆盖;
无效pushInput(节点*参数,布尔参数)覆盖;
}
void和::pushOutput(节点*param){
此->输出。推回(参数);
}
//AND::pushInput被省略,但它与AND::pushOutput非常相似,只是有一堆ifs。
类图{
受保护的:
//绘制所有地形图;

向量。我的代码对我来说似乎没问题。

不要保留指向存储在
向量
s中的对象的指针。
向量
结构将其所有成员保留在连续的内存块中,因此当向量变大时,可能需要分配一个新块,从而使指向
向量
中对象的所有指针无效

我还强烈建议不要使用原始指针的
向量
。这是一种糟糕的做法,使得管理对象的生命周期非常困难,而这恰恰是这里的错误


例如,您可以使用
std::shared_ptr
s的
vector
指向对象。然后您可以将其他
shared_ptr
s存储到其他集合中的那些对象。

不要保留指向存储在
vector
中的对象的指针。
vector
结构将其所有成员保留在连续内存中当向量变大时,ock和so可能需要分配一个新块,从而使指向
向量中对象的所有指针无效

我还强烈建议不要使用原始指针的
向量
。这是一种糟糕的做法,使得管理对象的生命周期非常困难,而这恰恰是这里的错误


>例如,可以使用<代码>向量>代码> STD::SydDypPTR< /Cult> s到对象。然后可以将附加的<代码> SydDypTr> /代码> s存储到其他集合中的那些对象。

您必须考虑迭代器失效。从On代码> STD::vector::PuxSuff-</代码>:

如果新的size()大于capacity(),则所有迭代器和 引用(包括结束迭代器之后的引用)无效。 否则,只有结束迭代器的过去部分无效

这里的“引用”是在更广泛的意义上使用的,即指向元素的指针也会失效。原因是
std::vector
保证将其数据保存在连续的内存块中,因此在推送新元素时,以前的元素可能必须移动


我对您的代码了解太少,无法给出更多建议。请注意,
std::list
不会在添加新元素时使迭代器无效(这同样适用于
std::map
)。但是,这通常是不值得付出的代价(没有
std::list
的数据区域是杀手)另一方面,如果容器的整个目的是使引用元素不失效,则它可能是一个有效的选择。

您必须考虑迭代器失效。 如果新的size()大于capacity(),则所有迭代器和 引用(包括结束迭代器之后的引用)无效。 否则,只有结束迭代器的过去部分无效

这里的“引用”是在更广泛的意义上使用的,即指向元素的指针也会失效。原因是
std::vector
保证将其数据保存在连续的内存块中,因此在推送新元素时,以前的元素可能必须移动


我对您的代码了解太少,无法给出更多建议。请注意,
std::list
不会在添加新元素时使迭代器无效(这同样适用于
std::map
)。但是,这通常是不值得付出的代价(没有
std::list
的数据区域是杀手).另一方面,如果容器的全部目的是在不失效的情况下启用引用元素,那么它可能是一个有效的选择。

请提供一个get a,似乎您需要对内存管理有一些基本的了解。我对您的代码了解很少,但原因可能是
std::vector
需要o在推送更多元素时重新分配,即指向元素的指针无效。推送向量的
std::map
有趣点不是这种情况。我认为这不会发生,因为它总是在向量的末尾。我还有其他选择吗?请提供一个get a,似乎您需要对memo有一些基本的了解Y管理我对你的代码了解很少,但可能的原因是当你推送更多元素时,
std::vector
需要重新分配,即指向元素的指针无效。对于推送向量的
std::map
有趣点,情况并非如此。我认为这不会发生,因为它总是在t的末尾他是矢量。我还有别的选择吗?是的。这就是问题所在。我以为这是我的问题
bool polar;
AND* AND_ptr;
unsigned int rhs0;
for(int l=0;l<A;l++)
{
    and_index++;
    AND AND_obj(and_index*2);
    AND_ptr=this->pushAnd(and_index*2,AND_obj);
//reading info from file here and putting on rhs0 and polar.
    AND_ptr->pushInput(findAnd(rhs0),polar);
    findAnd(rhs0)->pushOutput(findAnd(and_index*2));
    findAny(rhs0)->printNode();
}