std::向量迭代器不兼容 我在C++程序中执行时有一个错误(向量迭代器不兼容),我不理解。[(Windows /Visual C++ 2008 Express)] < /P>

std::向量迭代器不兼容 我在C++程序中执行时有一个错误(向量迭代器不兼容),我不理解。[(Windows /Visual C++ 2008 Express)] < /P>,c++,vector,iterator,C++,Vector,Iterator,以下是我的问题的简化版本: #include <vector> class A { int mySuperInt; public: A(int val) : mySuperInt(val) {} }; class B { std::vector<A*> myAs; public: B() { myAs.push_back(new A(1)); };

以下是我的问题的简化版本:

#include <vector>

class A
{
    int mySuperInt;
public:
    A(int val) : mySuperInt(val) {}
};
class B
{
    std::vector<A*> myAs;
    public:
        B() 
        {
            myAs.push_back(new A(1));
        };
        const std::vector<A*> getA() const {return myAs;}
};

int main()
{
    std::vector<B>* myBs = new std::vector<B>;

    myBs->push_back(B());

    std::vector<B>::const_iterator it_B = myBs->begin();
    for ( ; it_B != myBs->end(); ++it_B)
    {
        std::vector<A*>::const_iterator it_A = it_B->getA().begin();
        for ( ; it_A != it_B->getA().end(); ++it_A) // <-- Error during execution: vector iterator incompatibles
        {
            // Do stuff
            // ...
        }
    }
}
#包括
甲级
{
int mySuperInt;
公众:
A(int-val):mySuperInt(val){}
};
B类
{
std::载体myAs;
公众:
B()
{
myAs.推回(新A(1));
};
const std::vector getA()const{return myAs;}
};
int main()
{
std::vector*myBs=新的std::vector;
myBs->push_back(B());
std::vector::const_迭代器it_B=myBs->begin();
对于(;it_B!=myBs->end();++it_B)
{
std::vector::const_迭代器it_A=it_B->getA().begin();
对于(;it_A!=it_B->getA().end();++it_A)//您的
getA()
函数按值返回一个向量。您正在将循环迭代器初始化到该向量的开头,但由于返回的向量是临时的,它将在该行的末尾销毁

// at the end of this line the vector returned by getA is gone, so it_A is invalid.
std::vector<A*>::const_iterator it_A = it_B->getA().begin();
您的
getA()
函数按值返回一个向量。您正在将循环迭代器初始化到该向量的开头,但由于返回的向量是临时的,因此它将在该行的末尾销毁

// at the end of this line the vector returned by getA is gone, so it_A is invalid.
std::vector<A*>::const_iterator it_A = it_B->getA().begin();

您知道B::getAs()返回其myAs的一个副本。因此,它所覆盖的向量与其getA().end()一直被比较的向量是不同的副本…即for循环从未停止过。(更糟糕的是,它覆盖一个临时的向量,因此它被破坏,当你假装遍历它时,各种各样的随机垃圾可能会被写入该存储。)

你意识到B::getAs()返回其myAs的一个副本。因此它覆盖的向量与其getA()的向量是不同的副本。end()它不断地与…进行比较,例如for循环从未停止过(更糟糕的是,它覆盖一个临时向量,因此它被破坏,当你假装遍历它时,各种各样的随机垃圾可能会被写入该存储。)感谢您完整而简单的重新编译。这里的问题是您使用的迭代器来自两个不同的向量,这是一个运行时调试检查

您可能不打算这样做,但这是getA返回类型的结果

您返回的是向量的一个副本,您可能打算返回对向量的引用,如下所示:


const std::vector&getA()const{return myAs;}

感谢您完整而简单的重新编译。这里的问题是您使用的迭代器来自两个不同的向量,这是一个运行时调试检查

您可能不打算这样做,但这是getA返回类型的结果

您返回的是向量的一个副本,您可能打算返回对向量的引用,如下所示:


<代码> const STD::vector和GATA():{Myas;}

你是否有运行时错误?我刚编译了这个,并用GCC在Mac OS X上运行它。那么你的问题是什么?你没有告诉我们你的问题是什么,很难回答……“我在C++程序中执行的一个错误(向量迭代器不兼容),我不理解”还不够清楚吗?真的吗?你有运行时错误吗?我刚编译了这个,并用GCC在Mac OS X上运行它。那么你的问题是什么?你没有告诉我们你的问题是什么…很难回答……“在我不理解的C++程序中,我有一个错误(向量迭代器不兼容)”。还不够清楚?真的吗?那是…有点明显。非常感谢乔希!那是…有点明显。非常感谢乔希!